debugging 当我旋转gameObject时,它开始向错误的方向移动

mzaanser  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(121)

我正在练习我的Unity编程,通过创建一个自上而下的射击游戏,就像Stardew Valley的“草原之王之旅”。当我上下看并射击时,我试图将子弹旋转90度,以便它面向正确的方向。然而,每当我旋转子弹时,当我面朝上时,它向左移动,当我面朝下时,它向右移动。没有任何旋转,它运行得很好。下面是我的代码:

public class BulletMovement : MonoBehaviour
{
    public Vector2 moveDirection;
    private GameObject player;
    public int speed;
    
    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.Find("Player");
        Move();
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(moveDirection * Time.deltaTime * speed);
        CheckIfOutOfBounds();
    }
    
    //Moves the bullet in the direction the player is facing when the bullet is fired
    private void Move()
    {
        if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("up"))
        {
            RotateBullet(90);
            moveDirection = new Vector2(0, 1);
        }
        if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("down"))
        {
            RotateBullet(90);
            moveDirection = new Vector2(0, -1);
        }
        if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("left"))
        {
            //Moves the bullet in front of the gun
            transform.Translate(-0.363f, 0, 0);
            moveDirection = new Vector2(-1, 0);
        }
        if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("right"))
        {
            //Moves the bullet in front of the gun
            transform.Translate(0.363f, 0, 0);
            
            moveDirection = new Vector2(1, 0);
        }
    }

    //Destroys the bullet if it goes off-screen
    private void CheckIfOutOfBounds()
    {
        if (transform.position.x is > 10 or < -10)
        {
            Destroy(gameObject);
        }

        if (transform.position.y is > 10 or < -10)
        {
            Destroy(gameObject);
        }
    }

    private void RotateBullet(int degrees)
    {
        transform.rotation = Quaternion.Euler(new Vector3(0, 0, degrees));
    }
}

尝试:
transform.Rotate(Vector 3(0,0,90))transform.Rotate(Vector3.right))transform.rotation = Quaternion.Euler(new Vector 3(0,0,degrees)); ->当前使用

omqzjyyz

omqzjyyz1#

就像Buggarten提到的,这有点不正统,而且步骤比需要的多,但是。

// move dir should always be on x if you're also rotating.
if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("up"))
{
    RotateBullet(90);
    moveDirection = new Vector2(1, 0);
}
if (player.GetComponent<PlayerMovement>().GetPlayerFacing().Equals("down"))
{
    RotateBullet(90);
    moveDirection = new Vector2(-1, 0);
}

以下是你如何在真实的生活中测试这一点:
看着你的显示器然后向左走。
这是moveDirection = new Vector2(-1, 0);
现在看着你的显示器,把你的身体向左转90度,然后向前走。
也就是RotateBullet(90);moveDirection = new Vector2(0,1);
不同,但相同。
希望这有帮助
编辑:
我还建议在脚本中设置播放器,而不是通过在子弹脚本中使用gameobject.find()来示例化子弹,并将播放器更改为类型PlayerMovement而不是GameObject,这样你就不会经常调用getcomponent。
你不必担心这个项目的性能,但它会养成良好的习惯,永远不要使用gameobject.find()
编辑2(关于评论):
在你的脚本中,玩家射击,你生成一个子弹,我假设你正在做类似Instantiate(bulletPrefab,...);的事情,
您可以执行以下操作:

GameObject bullet = Instantiate(bulletPrefab,...);
bullet.GetComponent<YourBulletScript>().player = this;

// remember to change GameObject player to PlayerMovement player
// in your bullet script!

你也可以设置更多的东西,而不是回调到播放器,例如,你可以在这里设置movedirection,而不是使用GetPlayerFacing,那么你甚至不需要引用播放器。
对于我的解决方案,我通常有它,所以子弹脚本只是处理它自己的运动和它遇到的东西。我示例化它,给予它一个方向,它自己。

相关问题