2017-02-16 24 views
0

Я использую Unity для отслеживания цели изображения (ARCamera - Vuforia), и все работает отлично. Я вставил некоторые 2D спрайты в цель изображения и т. Д. ... но теперь я не хочу показывать все цели, как только цель изображения будет найдена, поэтому я отправился в DefaultTrackableEventHandler.cs и создал экземпляр моего пользовательского класса Пример так:Coroutine не работает нормально - Unity [C#]

#region PRIVATE_MEMBER_VARIABLES 

private TrackableBehaviour mTrackableBehaviour; 

#endregion // PRIVATE_MEMBER_VARIABLES 

public Example mainClass; 

...

private void OnTrackingFound() 
    { 
    ... 
     Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found"); 

     mainClass = new Example(); 
     mainClass.OnTrackableFound(); // Public method on 'Example' Class 
    } 

Теперь на моем примере класса:

общественного класса Пример: MonoBehaviour {

public SpriteRenderer forYou; 
public SpriteRenderer map; 

public Example() {} 

private bool isInTransition = false; 
private float transition = 1; 
private bool isShowing = false; 
private float duration = 0; 

void Start() 
{ 
    forYou = new SpriteRenderer(); 
    map = new SpriteRenderer(); 
} 

public void OnTrackableFound() { 
    StartCoroutine(FadeCoroutine()); 
} 

private IEnumerator FadeCoroutine() { 
    yield return new WaitForSeconds(1); 
    Fade(true, .1f); 
} 

public void OnTrackableLost() {} 

public void Fade (bool showing, float duration) 
{ 
    isShowing = showing; 
    isInTransition = true; 
    this.duration = duration; 
    transition = (isShowing) ? 0 : 1; 
} 

void Update() 
{ 
    if (Input.GetMouseButtonDown (0)) { 
     Fade (true, .1f); 
    } 
    if (Input.GetMouseButtonUp (0)) { 
     Fade (false, .1f); 
    } 


    if (!isInTransition) { 
     return; 
    } 

    transition += (isShowing) ? Time.deltaTime * (1/duration) : -Time.deltaTime * (1/duration); 
    forYou.color = Color.Lerp (Color.white, new Color (1, 1, 1, 0), transition); 
    map.color = Color.Lerp (Color.white, new Color (1, 1, 1, 0), transition); 

    if (transition > 1 || transition < 0) { 
     isInTransition = false; 
    } 
} 

} Извините за объем кода, но в основном это только для увядающей в/из некоторых спрайтов. Я хочу уступить, как только мой OnTrackingFound вызывается в классе Example и после idk .5 секунд исчезает в некоторых из моих спрайтов.

Спасибо!

EDIT - решаемые

Таким образом, чтобы прикрепить сценарий к объекту игры он должен наследоваться от Monobehaviour, но чем он не может быть реализован так, что я сделал: мне нужен OnTrackingFound() из DefaultTrackerHandler .. поэтому я закодировал все на этом классе [я знаю, что это далеко не лучшее решение, но ...] вместо создания экземпляра другого скрипта, потому что, поскольку я сказал, что невозможно будет подключить его к игровому объекту, поскольку он не может наследовать от Monobehaviour. С публичными игровыми объектами я привязывал все непосредственно от этого класса, который также наследуется от Monobehvr. Если вы создаете экземпляр сценария, который наследует monobehv, он будет равен нулю. Всем спасибо!

+0

Просто комментарий - The OnTrackableFound() вызывается обычно на моем Пример класса, но StartCoroutine внутри него никогда не вызывается. –

ответ

1

Проблема с вашим кодом заключается в том, что вы пытаетесь создать экземпляр компонента Example, который происходит от MonoBehaviour вызывающего конструктора с ключевым словом new.

Никогда не делайте этого.

Все компоненты в Unity3D двигателя должна быть добавлена ​​к существующим GameObject с GameObject.AddComponent<T>()

Так что вам нужно сделать, это:

private void OnTrackingFound() 
{ 
    ... 
    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found"); 

    // create new GameObject and add component 
    mainClass = new GameObject("MyNewGameobject").AddComponent<Example>(); 
    mainClass.OnTrackableFound(); // Public method on 'Example' Class 
} 
0

Кажется, что вы звоните mainClass = new Example(); каждый раз, когда отслеживается новая цель. Это создаст новый объект, хотя могут существовать уже существующие объекты. Я не верю, что ты этого хочешь.

Вместо этого попробуйте вызвать GameObject gobj = GameObject.Find() (потому что функция GameObject уже существует правильно?), Чтобы получить существующий объект GameObject, к которому прикреплен скрипт. Затем сделайте gobj.GetComponent<Example>(). OnTrackableFound(), чтобы вызвать событие в GameObject. Надеюсь, это поможет.

+0

Могу ли я сделать это из сценария с несовместимым поведением? Такие, как DefaultTracker ... Спасибо –

0

Я ответил question, который нуждается в задержке в гамедеве.

В основном вы увеличиваете стоимость сверхурочной работы float, и при желательном времени вы будете исчезать с спрайтом.

Псевдо:

float counter; 
bool isFadeReady = false; 
void Update() 
{ 
    if (OnTrackingFound) 
    { 

    isFadeReady = true; 
    } 

    if (isFadeReady == true) 
    { 
    counter +=0.1f; //change the value for increase speed 
    } 


    if(counter>=1.0f) //change the value for desired time 
    { 
    //Fade your sprite here 
    isFadeReady = false; 
    } 

} 

Надеется, что это помогает! Ура!