首页 > 解决方案 > Unity 相机无法正确跟随

问题描述

根据教程创建了一个操纵杆脚本以允许玩家移动。下面附上脚本:

 public Transform player;
Vector3 move;
public float moveSpeed;

public RectTransform pad;
public void OnDrag(PointerEventData eventData)
{
    transform.position = eventData.position; 
    transform.localPosition = Vector2.ClampMagnitude(eventData.position - (Vector2)pad.position, pad.rect.width * 0.5f);
    move = new Vector3(transform.localPosition.x, 0, transform.localPosition.y).normalized; 
   
}
public void OnPointerUp(PointerEventData eventData) 
{
    transform.localPosition = Vector3.zero;
    move = Vector3.zero;
    StopCoroutine("PlayerMove");
}

public void OnPointerDown(PointerEventData eventData)
{
    StartCoroutine("PlayerMove");
}

IEnumerator PlayerMove()
{
    while (true)
    {
        player.Translate(move * moveSpeed * Time.deltaTime, Space.World);

        if (move != Vector3.zero)
        {
            // there is a clash here
            player.rotation = Quaternion.Slerp(player.rotation, Quaternion.LookRotation(move), 5f * Time.deltaTime);
        }
        Debug.DrawRay(player.position, move, Color.red);
        yield return null;
    }
}

我也从教程中创建了一个跟随相机,它们都相互冲突。下面附上相机脚本:

public class AdvancedFollowCamera : BaseCamera
{
    #region Variables
    public float m_Distance = 10f;
    public float m_Height = 5f;
    public float m_SmoothSpeed = 2f;

    private Vector3 wantedPosition;
    private Vector3 wantedBack;
    private float wantedYAngle;

    protected JoyStickController joystick;
    #endregion

    #region Helper Methods

    protected override void HandleCamera()
    {
        base.HandleCamera();

        wantedYAngle = Mathf.LerpAngle(wantedYAngle, m_Target.eulerAngles.y, Time.deltaTime * m_SmoothSpeed);

        Vector3 back = Vector3.back;
        back = Quaternion.AngleAxis(wantedYAngle, Vector3.up) * back;
        Debug.DrawRay(m_Target.position, back, Color.green);

        wantedPosition = (back * m_Distance) + (Vector3.up * m_Height) + m_Target.position;

        transform.position = wantedPosition;
        transform.LookAt(m_Target);

    }

    #endregion

}

问题是当我将玩家的变换放置到相机并开始移动操纵杆时,相机到处乱转,开始忙碌地移动。玩家急转弯,相机开始旋转。我认为的部分冲突的是第一个脚本中的 player.rotation(我在那里发表了评论)。问题是我无法移除它,因为我需要它,操纵杆指向的地方玩家会看到它的方向。我昨天刚刚了解了四元数,并尝试了很多方法,但我不知道如何解决它。

我已经从另一个教程中尝试过这个脚本,但这表明玩家旋转非常快,可以说,玩家转动非常快,相机也是如此:

 public class FollowCamV1 : MonoBehaviour
{
[SerializeField]
Transform target;
[SerializeField]
Vector3 defaultDistance = new Vector3(0f, 2f, -10f);
[SerializeField]
float distanceDamp = 10f;
[SerializeField]
float rotationalDamp = 10f;

Transform cam;
// Start is called before the first frame update
void Awake()
{
    cam = transform;
}

// Update is called once per frame
void LateUpdate()
{
    Vector3 toPos = target.position + (target.rotation * defaultDistance);
    Vector3 curPos = Vector3.Lerp(cam.position, toPos, distanceDamp * Time.deltaTime);
    cam.position = curPos;

    Quaternion toRot = Quaternion.LookRotation(target.position - cam.position, target.up);
    Quaternion curRot = Quaternion.Slerp(cam.rotation, toRot, rotationalDamp * Time.deltaTime);
    cam.rotation = curRot;
}
}

有人可以告诉我问题出在哪里,我哪里出错了?

标签: c#unity3dtransformquaternions

解决方案


推荐阅读