繁体   English   中英

表现怪异的transform.lookat或我错过了一些东西(unity3d C#)

[英]transform.lookat behaving weirdly OR I am missing something (unity3d c#)

我正在尝试从坏家伙实例化一个预制的火球,并在实例化时将当前玩家位置传递到火球,并使用该位置将火球瞄准玩家。 火球在其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

这些都产生相同的结果。

这是我的代码。

编写代码以从Baddie实例化火球。

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);
    }
}

错误在于使用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.Self的默认Vector3.forward而不是transform.forward

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM