【问题标题】:Unity - Vector3.MoveTowards does not move at constant speedUnity - Vector3.MoveTowards 不会以恒定速度移动
【发布时间】:2021-07-30 02:49:59
【问题描述】:

我正在尝试设计一种吐痰球/毒药类型的弹丸,它会一直移动,直到它到达屏幕上点击的点,然后自行摧毁。 问题在于,与几乎所有人所说的相反,Vector3.Movetowards 并没有以恒定的速度移动球。如果目标位置靠近发射器,则移动速度较慢,如果距离较远,则移动速度更快。

public float speed = 5f;
public Vector3 target = new Vector3();
void Update()
{

    transform.position = Vector3.MoveTowards(transform.position, target,speed * Time.deltaTime);
}

添加启动脚本

 private void Shooting()
{
    if (Input.GetMouseButton(0))
    {
        if (Time.time >= shotTime)
        {
           
            GameObject poison = Instantiate(Projectile, shotPoint.position, transform.rotation);
            Vector3 target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            target.z = 10f;
            poison.GetComponent<PoisonBall>().target = target;
            shotTime = Time.time + timeBetweenShots;
        }
    }
}

【问题讨论】:

  • 如果你正在创建一个“发射器”,你可能想看看使用刚体并施加力,这样你就可以从物理中获得弧线。但是,您的 MoveTorwards 代码看起来是正确的。目标当前是在编辑器中设置,还是代码没有显示?
  • 目标由启动器设置(它已经面向鼠标指向的方向)在实例化对象后,使用screentoworldpoint将目标设置为当前鼠标位置。
  • Vector3.MoveTowards 以您传入的任何速度(或每次调用更好的最大步长)将当前位置移向目标,如果它是恒定的线性并且目标位置同时没有改变,那么运动会如此。您描述的行为不可重现或缺少特定于您案例的其他信息
  • 我添加了用于实例化毒球的启动器(更像是枪而不是发射器)的代码。

标签: c# unity3d


【解决方案1】:

球的起始位置是否也在z=10f?否则,速度差异很可能是 2D 游戏中的透视问题,导致子弹沿 Z 方向移动,但从您的相机角度看,您看不到。

=> 离目标越近,仅在 Z 轴上发生的运动越多,越远,在 X 和 Y 轴上发生的运动越多。

确保也这样做

var spawn = shotPoint.position;
spawn.z = 10f;
GameObject poison = Instantiate(Projectile, spawn, transform.rotation);

或者保留target.z = 0 (只需删除target.z = 10f 行,默认情况下ScreenToWorld 使用给定向量的Z 分量作为深度,并且无论如何您传递的都是0 深度的二维向量),而是使用@ 987654321@ 将忽略 Z 上的蚂蚁深度。

【讨论】:

  • 做到了。我已经读过 screentoworldpoint 由于相机的 z 位置而导致问题,所以我试图在脚本中进行调整。将 target.z 设置为 0 修复它。
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多