长按按钮弹跳后如何让我的摇杆旋转?

How to make my stick rotating after bouncing with button long pressed?

基本上我想制作弹跳杆和旋转控制,左右 button.i 面临一个问题,旋转不如我预期的好,因为它不会像受影响一样跟随我的按钮通过弹跳后的东西,

我正在使用 2d 物理 material 与 friction = 1Bounciness = 0.9797 完美弹跳也附加到 rigidbody2d。

我不知道,我应该把它附加到对撞机上吗?

这里是我的播放器控制脚本:

public Rigidbody2D r2d;

public float vertical;
public float horizontal;
public Joystick joystick;

private void Start() {
    r2d = gameObject.GetComponent < Rigidbody2D > ();
    joystick = FindObjectOfType < Joystick > ();
}

private void Update() {
    Movement();
}

public void Movement() {
    r2d.velocity = r2d.velocity.normalized * 7f;

    //horizontal = joystick.Horizontal;
    //vertical = joystick.Vertical;

    //if (horizontal == 0 && vertical == 0)
    //{
    //    Vector3 curRot = transform.localEulerAngles;
    //    Vector3 homeRot = transform.localEulerAngles;

    //    transform.localEulerAngles = Vector3.Slerp(curRot, homeRot, Time.deltaTime * 2);
    //}
    //else
    //{
    //    transform.localEulerAngles = new Vector3(0f, 0f, Mathf.Atan2(horizontal, vertical) * -180 / Mathf.PI);
    //}
}

public Vector3 target;
public float rotationSpeed = 10f;
public float offset = 5;

public void turnLeft() {
    Vector3 dir = target - transform.position;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
    Quaternion rotation = Quaternion.Euler(new Vector3(0, 0, angle + offset));
    transform.rotation = Quaternion.Slerp(transform.rotation, -rotation, rotationSpeed * Time.deltaTime);
}

public void turnRight() {
    Vector3 dir = target - transform.position;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
    Quaternion rotation = Quaternion.Euler(new Vector3(0, 0, angle + offset));
    transform.rotation = Quaternion.Slerp(transform.rotation, rotation, rotationSpeed * Time.deltaTime);
}

每当涉及到 Rigidbody/Rigidbody2D 时,您 不想 想通过 .transform 组件操纵任何东西!

这打破了物理、碰撞检测并导致奇怪的运动,基本上是变换“战斗”以优先考虑物理。

你更想做的是,例如调整 Rigidbody2D.angularVelocity

public void turnLeft()
{
    // Note that Time.deltaTime only makes sense if this is actually called every frame!
    r2d.angularVelocity -= rotationSpeed * Time.deltaTime;
}

public void turnRight()
{
    r2d.angularVelocity += rotationSpeed * Time.deltaTime;
}