C# 为什么当游戏手柄松开时,我的游戏对象会返回到某个z位置?

C# 为什么当游戏手柄松开时,我的游戏对象会返回到某个z位置?,c#,unity3d,C#,Unity3d,我在unity做一个小项目。这是一个自上而下的游戏,它有一个由操纵杆控制的角色。当我运行游戏时,我的角色在z位置开始-90,该位置应为0。但当我将操纵杆移动到我希望它运行的方向时,它工作正常,这意味着它正朝向它运行的方向。然而,如果我放开操纵杆,角色会在z位置弹回到-90,我试图找出它为什么会这样做,并防止它发生 我在这里找了一些教程视频和帖子,但没有一个能回答我的问题。我还尝试删除Mathf.Atan2公式中的“-90f”,但当我删除时,它在z位置旋转90。也就是说,当我直接向下操纵杆时,角色

我在unity做一个小项目。这是一个自上而下的游戏,它有一个由操纵杆控制的角色。当我运行游戏时,我的角色在z位置开始-90,该位置应为0。但当我将操纵杆移动到我希望它运行的方向时,它工作正常,这意味着它正朝向它运行的方向。然而,如果我放开操纵杆,角色会在z位置弹回到-90,我试图找出它为什么会这样做,并防止它发生

我在这里找了一些教程视频和帖子,但没有一个能回答我的问题。我还尝试删除Mathf.Atan2公式中的“-90f”,但当我删除时,它在z位置旋转90。也就是说,当我直接向下操纵杆时,角色会向右旋转

这是我的密码:

public class PlayerController : MonoBehaviour
{

    public static PlayerController instance;

    public Rigidbody2D rb;
    public Joystick joystick;

    private float moveSpeed = 2.5f;
    Vector2 movement;


    // Update is called once per frame
    void Update()
    {
        movement.x = joystick.Horizontal;
        movement.y = joystick.Vertical;
    }

    void FixedUpdate()
    {
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        float angle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg - 90f;
        transform.rotation = Quaternion.Euler(new Vector3(0f, 0f, angle));
    }


我希望在游戏开始时,我的角色在z位置从0开始,并且在游戏放开之前,角色保持并面向操纵杆的方向,而不是在z位置旋转回-90。

多亏了@TheLazyScript,我能够重新编写我的脚本,并让我的角色完成我需要的任务。我只是忽略了它在FixedUpdate上,所以即使我停止操纵杆,它也会继续调用它。我还是个编程高手,在过去的一周里我一直在学习,我没有休息。总之,我对代码做了如下处理:

void Update()
    {
        if (joystick.Horizontal >= .1f || joystick.Horizontal <= -.1f)
        {
            movement.x = joystick.Horizontal;
            MoveCharacter();
        }
        else
        {
            movement.x = 0f;
            angle = 0f;
        }

        if (joystick.Vertical >= .1f || joystick.Vertical <= -.1f)
        {
            movement.y = joystick.Vertical;
            MoveCharacter();
        }
        else
        {
            movement.y = 0f;
            angle = 0f;
        }
    }

    void MoveCharacter()
    {
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        angle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg - 90f;
        transform.rotation = Quaternion.Euler(new Vector3(0f, 0f, angle));
    }
void Update()
{

如果(操纵杆.水平>=.1f | |操纵杆.水平=.1f | |操纵杆.垂直)显示当前和所需角色运动的两个图像(带轴)会对我们有帮助。另外,你是在使用2D还是3D物理?我相信你的回退问题在于你正在根据当前的移动检查和更新角度。这在你移动时有效,但当你停止
Mathf.Atan2(0,0)时有效*Mathf.Rad2Deg-90f;
被计算。然后向旋转。最好仅在上次更新后移动或位置发生变化时更新角度。@Immersive Im使用2Dphysics@TheLazyScripter我还没有想到,我会试试你的建议,如果成功的话,我会回来的。