【问题标题】:How do I move a sphere towards, starting from players position?我如何从玩家位置开始移动球体?
【发布时间】:2020-02-24 20:25:14
【问题描述】:

我正在用 Unity 制作游戏。我的任务是当玩家按下“1”键时,它会向 player.transform.forward 位置射出一个球体,直到它与敌人相撞。

问题是,当球体被射击时,当它飞行时,我可以通过左右转动玩家来控制它的移动 X 值。所以球体和我一起移动,但它不应该。这当然是因为在 Update() 中,我将它移动到玩家面对的方向。如何使球体开始面向玩家方向,但在独立移动后?

这是移动球体的代码

private float speed = 4.0f;

void Update()
    {
        transform.Translate(player.transform.forward * Time.deltaTime * speed);
    }

【问题讨论】:

  • 不要使用玩家的位置来移动,使用自己的
  • 我需要开始移动玩家当时面对的球体
  • 所以实例化它面向那个方向并移动它
  • 请发布您实例化/初始化球体的代码
  • 这个问题已经解决了,谢谢大家帮忙

标签: c# unity3d


【解决方案1】:

您可以保存它的初始“前进”方向并在之后引用它

public GameObject player;

private float speed = 4.0f;
private Vector3 direction;

private void Awake() //I used Awake() as example asuming you are instantiating the sphere, 
{                    //but you could set the value of the direction when you press "1" too

    direction = player.transform.forward;
}

void Update()
{
    transform.Translate(direction * Time.deltaTime * speed);
}

【讨论】:

  • 这是一个选项,但需要 A) 设置播放器参考和 B) 注意 Translate 默认在 local 空间中工作。因此,如果您想作为世界空间矢量传递方向,则需要 transform.Translate(..., Space.World);!
  • 就是这样!我在播放器文件中实例化这个预制件,然后在球体的文件 Start() 方法中设置这个方向。完美的!非常感谢,祝大家有个愉快的一天。
【解决方案2】:

用正确的方向实例化它

Instantiate(rangedAttack, spawnPosition, player.transform.rotation);

现在它自己的前向向量指向与玩家相同的方向。

然后简单地做

private float speed = 4.0f;

void Update()
{
    transform.Translate(Vector3.forward * Time.deltaTime * speed);
}

注意 Translate 默认工作在Space.Self 所以这个转换的本地空间。您不想在此处传递世界空间向量,而只想在本地 Z 轴上移动!

如果你传入一个世界空间向量,你需要传入 Space.World

transform.Translate(vector, Space.World);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多