【问题标题】:transform.lookat behaving weirdly OR I am missing something (unity3d c#)transform.lookat 行为怪异或者我遗漏了一些东西(unity3d c#)
【发布时间】:2017-10-03 21:57:03
【问题描述】:

我正在尝试从一个坏人实例化一个预制件,一个火球,并在实例化时将当前玩家位置传递给火球,并使用它来将火球瞄准玩家。火球在其 transform.forward 向量上平移/移动。因此,火球应该在火球创建时从坏人朝向玩家的位置。

我发现正在设置方向(通过火球上的transform.lookat() 函数),但它几乎总是错误的方向。这不是 90 或 180 折。它偏离多少取决于玩家相对于坏人的位置。图案围绕 z 轴对称。

假设坏人在 (0,0,0):

  • 当玩家位于 (0,0,10) 时,火球会直接朝玩家飞去
  • 当玩家在 (0,0,-10) 时,火球会远离玩家(180 度。完全相反的方向。与玩家在 (0,0,10) 时的方向相同)
  • 当玩家位于 (10,0,0) 时,火球会朝玩家的方向 90 度(如果面对坏人,则向玩家右侧)
  • 当玩家在 (-10,0,0) 时,火球会朝玩家 90 度的方向飞去(如果面对坏人,火球会朝左边的玩家)

当玩家通过这些角度时,这些值会平稳移动。它只会向一个方向击中玩家。

我尝试了以下方法(其中一些可能不是必需的):

  • 重新导入所有资产
  • 在新机器上创建新项目以重现该问题。
  • 我尝试将lookat 变量设置为:
    • 玩家变换
    • 玩家的矢量 3 世界坐标(这是下面代码中的内容)
    • player.transform.position - baddie.transform.position
    • baddie.transform.position - player.transform.position

这些都产生相同的结果。

这是我的代码。

从坏人那里实例化火球的代码。

public class Baddie : MonoBehaviour {

    public GameObject fireballPrefab;
    public GameObject playerGameObject;
    public float countDownForFireball;
    private float currentCountDownForFireball;

    void Start () {
        playerGameObject = GameObject.FindGameObjectWithTag("Player");
        currentCountDownForFireball = 0;
    }

    void Update () {

        if(currentCountDownForFireball <= 0)
        {
            GameObject newFireball = GameObject.Instantiate(fireballPrefab, transform.position, Quaternion.identity);
            newFireball.GetComponent<Fireball>().SetTarget(playerGameObject.transform.position);
            currentCountDownForFireball = countDownForFireball;
        }
        else
        {
            currentCountDownForFireball -= Time.deltaTime;
        }
    }
}

火球上的代码

public class Fireball : MonoBehaviour {

    private float moveSpeed;
    private Vector3 target;

    // Use this for initialization
    void Start () {
        moveSpeed = 15f;
    }

    // Update is called once per frame
    void Update (){
        transform.Translate(transform.forward * Time.deltaTime * moveSpeed);
    }

    public void SetTarget(Vector3 newTarget){
        target = newTarget;
        transform.LookAt(target);
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    错误在于Transform.Translate的使用。它的辅助参数是 Space 参数,默认为 Space.Self。你希望你的方向空间与你正在翻译的空间相匹配,所以你想传入Space.World

    // transform.forward is the transform's forward vector in "world space"
    transform.Translate(transform.forward * Time.deltaTime * moveSpeed, Space.World);
    

    或者,您可以继续使用默认的Space.SelfVector3.forward 而不是transform.forward

    // Vector3.forward is (0,0,1). In "self space" this is "forward"
    transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed); // Space.Self
    

    【讨论】:

    • 谢谢,谢谢!两种解决方案都有效!非常感谢!
    • @user8716181 很高兴帮助任何人通过示例、图像和测试用例发布如此详尽的问题;D
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2011-05-14
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多