提问者:小点点

协同程序运行不正常-统一[C]


我使用Unity跟踪一些图像目标(ARCamera-Vuforia),一切正常。我已经在图像目标等上插入了一些2D精灵...但是现在我不想在找到图像目标后立即显示所有目标,所以我去了DefaultTrackableEventHandler.cs并实例化了我的自定义类示例如下:

 #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
    }

现在,在我的示例课上:

公共课示例:单一行为{

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;
    }
}

}抱歉代码的数量,但基本上这只是淡入/淡出一些精灵。我想尽快屈服,因为我的OnTracking找到是在示例类调用后idk.5秒在我的一些精灵中消失。

谢谢你!

因此,要将脚本附加到游戏对象,它必须从MonoBehavior继承,但不能实例化,所以我所做的是:我需要DefaultTrackerHandler提供的OnTrackingFound()。。。因此,我对该类的所有内容进行了编码[我知道这远不是最好的解决方案,但…]而不是实例化另一个脚本,因为正如我所说的,它不可能附加到游戏对象,因为它不能从MonoBehavior继承。对于公共游戏对象,我直接附加了这个类中继承自Monobehvr的所有内容。如果实例化继承monobehv的脚本,它将为null。谢谢大家!


共3个答案

匿名用户

代码的问题是,您试图实例化组件示例,该组件派生自使用new关键字调用构造函数的MonoBe行为

永远不要这样做。

Unity3D引擎中的所有组件都需要通过GameObject添加到现有的GameObject。添加组件

所以你需要做的是:

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
}

匿名用户

似乎您正在调用mainClass=newexample()每次跟踪新目标时。这将创建一个新对象,即使可能存在一个现有对象。我不相信你想要这个。

相反,尝试调用GameObject gobj=GameObject。Find()(因为游戏对象已经存在,对吗?)函数获取脚本附加到的现有游戏对象。然后做一个gobj。GetComponent

匿名用户

我在gamedev中回答了一个需要延迟的问题。

基本上,您将随时间增加一个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;
   }

}

希望这有帮助!干杯

相关问题