【问题标题】:Unity3D - Why my object doesnt move every frame per secondUnity3D - 为什么我的对象每秒不移动每一帧
【发布时间】:2021-11-12 19:09:45
【问题描述】:

我正在努力解决非常奇怪且可能很简单的问题,我创建了一个机器人,他的任务是朝着目标移动我的意思是我在 void update 中使用 Vector3.MoveTowards 函数来每帧移动我的机器人,但问题是他仅移动一次并停止,他正在迈出一步而不是例如 100 步。我正在使用 Unity3D。这是源代码;

public class Test01 : MonoBehaviour
{
public float speed, stopDist, rotationSpeed, moveSpeed, minSpeed, maxBackSpeed, maxFrontSpeed, turnSpeed, riseSpeed;
public Transform target;
private Rigidbody rb;
private float currentSpeed;

public bool isFinding = false;
private PlaySound signal;

void Start()
{
    signal = GameObject.FindGameObjectWithTag("Signal").GetComponent<PlaySound>();
    rb = GetComponent<Rigidbody>();
}

private void Update()
{
    // If space key button is pressed the robot's isFinding bool is becaming true and robot is starting searching for target.
    if (Input.GetKeyDown(KeyCode.Space))
    {
        isFinding = true;
        if (Vector3.Distance(transform.position, target.position) > stopDist)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
            signal.isAlarming = true;
            signal.Sound();
        }
        else if (Vector3.Distance(transform.position, target.position) < stopDist)
        {
            isFinding = false;
            signal.isAlarming = false;
            SoundManager.instance.StopSound();
            StopChasing();
        }
    }
}
 public void StopChasing()
{
    transform.position = this.transform.position;
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    目前您将所有内容都嵌套在GetKeyDown 下,因此它只执行一次

    你可以改变这种做法

    if (Input.GetKeyDown(KeyCode.Space))
    {
        isFinding = true;
    }
    
    if(isFinding)
    {
        if (Vector3.Distance(transform.position, target.position) > stopDist)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
            signal.isAlarming = true;
            signal.Sound();
        }
        else
        {
            isFinding = false;
            signal.isAlarming = false;
            SoundManager.instance.StopSound();
            StopChasing();
        }
    }
    

    所以按Space一次会激活isFinding模式,直到它到达Vector3.Distance(transform.position, target.position) &lt; stopDist

    【讨论】:

      【解决方案2】:

      Input.GetKeyDown 是您按下键时的功能。

      您可能希望将其更改为 Input.GetKey,这样每次您保持空间时它都会移动。

      这样,

      private void Update()
      {
          // If space key button is pressed the robot's isFinding bool is becaming true and robot is starting searching for target.
          if (Input.GetKey(KeyCode.Space))
          {
              isFinding = true;
              if (Vector3.Distance(transform.position, target.position) > stopDist)
              {
                  transform.position = Vector3.MoveTowards(transform.position, target.position, speed* Time.deltaTime);
                  signal.isAlarming = true;
                  signal.Sound();
              }
              else if (Vector3.Distance(transform.position, target.position) < stopDist)
              {
                  isFinding = false;
                  signal.isAlarming = false;
                  SoundManager.instance.StopSound();
                  StopChasing();
              }
          }
      }
      

      如果您使用Input.GetKeyDown 让机器人开始瞄准。然后像这样拆分

      private void Update()
      {
          // If space key button is pressed the robot's isFinding bool is becaming true and robot is starting searching for target.
          if (Input.GetKeyDown(KeyCode.Space))
          {
              isFinding = true;
          }
          if (isFinding)
          {
              if (Vector3.Distance(transform.position, target.position) > stopDist)
              {
                  transform.position = Vector3.MoveTowards(transform.position, target.position, speed* Time.deltaTime);
                  signal.isAlarming = true;
                  signal.Sound();
              }
              else if (Vector3.Distance(transform.position, target.position) < stopDist)
              {
                  isFinding = false;
                  signal.isAlarming = false;
                  SoundManager.instance.StopSound();
                  StopChasing();
              }
          }
      }
      

      毕竟,您之前所做的并没有真正使用 isFinding 作为任何东西,您只需将其设置为 true,它不会对代码产生任何影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-28
        • 2014-06-15
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多