c# - 更新停止在特定情况下调用函数。请详细阅读

标签 c# unity3d

只要我的洞进入屏幕的任何角落(左上右上MoveTowardTaget();” >、左下右下)。

我正在生成空洞的随机位置,当空洞到达该点时它会触发,然后生成另一个新的随机位置并且空洞开始向该点移动。

每当它到达屏幕的角落(左上角或右上角和左下角或右下角)时,它就会停止调用 MoveTowardTaget() 函数。只想知道避免这种情况的原因和建议。这不是每次都会随机发生。

https://drive.google.com/file/d/1e3wdlJvNAFN1gpYzP7-Mf-fTJgFfGBLk/view?usp=sharing

问题截图

  public class Hole : MonoBehaviour {

    // Update is called once per frame
    void Update () {
        MoveTowardTaget();
        CheckInterval();
        print("Target Position Distance "+Vector3.Distance(this.transform.position, targetposition));      

    }

    IEnumerator Fire()
    {

            yield return new WaitForSeconds(fireDelay);
            //Firing Object
            }

        GenerateNewPosition();
    }

    void GenerateNewPosition()
    {
        Vector2 ScreenSize = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, this.transform.position.z));
        Xlimit = ScreenSize.x;
        Ylimit = ScreenSize.y;
        targetposition.x = Mathf.Clamp(Random.Range(-Xlimit, Xlimit), -(Xlimit * 0.8f), Xlimit * 0.8f);
        targetposition.y = Mathf.Clamp(Random.Range(-Ylimit, Ylimit), -(Ylimit * 0.7f), Ylimit * 0.5f);
        targetposition.z = this.transform.position.z;
        Debug.Log("NewPosition "+ targetposition);
    }

    void MoveTowardTaget()
    {

        //print("calling");
        if (Vector3.Distance(this.transform.position, targetposition) > 0.1f)
        {
            //print("condition aaaa " + Vector3.Distance(this.transform.position, targetposition));
            firedOnce = true;
            this.transform.position = Vector3.MoveTowards(transform.position, targetposition, holemovingdpeed * Time.deltaTime);

        }
        else if (firedOnce)
        {
            //print("condition bbb " + Vector3.Distance(this.transform.position, targetposition));

            StartCoroutine(Fire());
            firedOnce = false;
        }
    }
    void CheckInterval()
    {
        TotalTimeForPlay += Time.deltaTime;

        if (TotalTimeForPlay == firstInterval && !firstImplemented)
        {
            fireDelay = fireDelay * 0.3f;
            holemovingdpeed = holemovingdpeed + (holemovingdpeed * 0.2f);
            firstImplemented = true;
            TotalTimeForPlay = 0f;
        }
        if (TotalTimeForPlay >= SecondInerval && !seondImplemented)
        {
            fireDelay = fireDelay * 0.3f;
            holemovingdpeed = holemovingdpeed + (holemovingdpeed * 0.4f);

            seondImplemented = true;
        }

    }

}

最佳答案

不是 MoveTowardTaget() 没有被调用,而是其中没有发生任何事情。

您没有正确考虑新目标非常接近或等于旧目标的情况。您应该在设置新目标时重置标志,而不是在发生移动(可能不会发生)时:

void GenerateNewPosition() 
{ 
    Vector2 ScreenSize = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, this.transform.position.z)); 
    Xlimit = ScreenSize.x; 
    Ylimit = ScreenSize.y;
    targetposition.x = Mathf.Clamp(Random.Range(-Xlimit, Xlimit), -(Xlimit * 0.8f), Xlimit * 0.8f); 
    targetposition.y = Mathf.Clamp(Random.Range(-Ylimit, Ylimit), -(Ylimit * 0.7f), Ylimit * 0.5f); 
    targetposition.z = this.transform.position.z; 
    Debug.Log("NewPosition "+ targetposition); 

    firedOnce = true; 
} 

void MoveTowardTaget() 
{ 
    //print("calling"); 
    if (Vector3.Distance(this.transform.position, targetposition) > 0.1f) 
    { 
        //print("condition aaaa " + Vector3.Distance(this.transform.position, targetposition)); 
        this.transform.position = Vector3.MoveTowards(transform.position, targetposition, holemovingdpeed * Time.deltaTime); 
    } 
    else if (firedOnce) 
    { 
        //print("condition bbb " + Vector3.Distance(this.transform.position, targetposition)); 
        StartCoroutine(Fire()); 
        firedOnce = false; 
    } 
}

关于c# - 更新停止在特定情况下调用函数。请详细阅读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57791169/

相关文章:

c# - 根据 () => func 创建函数

c# - 从主摄像头射击弹丸时左右瞄准

c# - 除非继承,否则使 C# 不实例化类的最简单方法?

c# - 认知服务。 Azure 端点不工作

c# - 无法将 azure storage api nuget 包添加到我的控制台应用程序

c# - 选择和跳过元素

c# - 多次使用 C# 比较 2 个巨大的列表(有一个转折点)

unity3d - 为什么 Unity 在构建中包含编辑器目录

c# - n 秒后注视触发事件 - Unity

c# - 在另一个线程中从数据库中检索数据(Unity3D)