Unity镜头跟随鼠标位置转换视野

public class MouseLook : MonoBehaviour 
{ 
Vector2 _mouseAbsolute; 
Vector2 _smoothMouse;

public Vector2 clampInDegrees = new Vector2(360, 180);
public bool lockCursor;
public Vector2 sensitivity = new Vector2(2, 2);
public Vector2 smoothing = new Vector2(3, 3);
public Vector2 targetDirection;
public Vector2 targetCharacterDirection;

// Assign this if there's a parent object controlling motion, such as a Character Controller.
// Yaw rotation will affect this object instead of the camera if set.
public GameObject characterBody;

void Start()
{
    // Set target direction to the camera's initial orientation.
    targetDirection = transform.localRotation.eulerAngles;

    // Set target direction for the character body to its inital state.
    if (characterBody) targetCharacterDirection = characterBody.transform.localRotation.eulerAngles;
}

void Update()
{
    // Ensure the cursor is always locked when set
    //Screen.lockCursor = lockCursor;

    // Allow the script to clamp based on a desired target value.
    var targetOrientation = Quaternion.Euler(targetDirection);
    var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection);

    // Get raw mouse input for a cleaner reading on more sensitive mice.
    var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));

    // Scale input against the sensitivity setting and multiply that against the smoothing value.
    mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y));

    // Interpolate mouse movement over time to apply smoothing delta.
    _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
    _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);

    // Find the absolute mouse movement value from point zero.
    _mouseAbsolute += _smoothMouse;

    // Clamp and apply the local x value first, so as not to be affected by world transforms.
    if (clampInDegrees.x < 360)
        _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f);

    // Then clamp and apply the global y value.
    if (clampInDegrees.y < 360)
        _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f);

    var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right);
    transform.localRotation = xRotation;



    transform.localRotation *= targetOrientation;

    // If there's a character body that acts as a parent to the camera
    if (characterBody)
    {
        var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, characterBody.transform.up);
        characterBody.transform.localRotation = yRotation;
        characterBody.transform.localRotation *= targetCharacterOrientation;
    }
    else
    {
        var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up));
        transform.localRotation *= yRotation;
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值