只要我的洞进入屏幕的任何角落(左上,右上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/