【Unity3D】视角移动、旋转、缩放,控制摄像机移动 764424567

Unity3d 鼠标和键盘控制摄像机的视角缩放与扩大、视角平移、视角旋转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Mouse_Controller : MonoBehaviour
{
    public float xRoatationSpeed = 250.0f;
    public float yRoatationSpeed = 120.0f;

    public float moveSpeed = 800f;

    public float yRoatationMinLimit = -90f;
    public float yRoatationMaxLimit = 90f;

    public float ScaleSpeed = 300;

    public float KeyboardMoveSpeed = 10;
    public float DefaultKeyboardMoveSpeed = 10;
    public float KeyboardMoveAcceleratedSpeed = 3;

    public float MaxMoveDistance = 5000f;

    private KeyCode _forwardKey = KeyCode.W;

    public KeyCode ForwardKey
    {
        get { return _forwardKey; }
        set { _forwardKey = value; }
    }

    private KeyCode _backKey = KeyCode.S;

    public KeyCode BackKey
    {
        get { return _backKey; }
        set { _backKey = value; }
    }

    private KeyCode _leftKey = KeyCode.A;

    public KeyCode LeftKey
    {
        get { return _leftKey; }
        set { _leftKey = value; }
    }

    private KeyCode _rightKey = KeyCode.D;

    public KeyCode RightKey
    {
        get { return _rightKey; }
        set { _rightKey = value; }
    }
    private void Update()
    {
        Vector3 intos = gameObject.transform.position;
        if (intos.y<-5600)
        {
            moveSpeed = 80f;
            ScaleSpeed = 30f;
        }
        else if (intos.y >-5600)
        {
            moveSpeed = 800f;
            ScaleSpeed = 3000f;
        }
    }

    void Awake()
    {
        
    }

    void Start()
    {
    }

    void LateUpdate()
    {
        Vector3 oldPos = this.transform.position;

        //鼠标左键
        if (Input.GetMouseButton(0))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.left).normalized * (Input.GetAxis("Mouse X") * moveSpeed * 0.02f);
            position += transform.TransformDirection(Vector3.down).normalized * (Input.GetAxis("Mouse Y") * moveSpeed * 0.02f);

            movePosition(position);
        }

        ////鼠标右键
        //if (Input.GetMouseButton(1))
        //{
        //    float x = 0;
        //    float y = 0;

        //    x += Input.GetAxis("Mouse X") * xRoatationSpeed * 0.02f;
        //    y -= Input.GetAxis("Mouse Y") * yRoatationSpeed * 0.02f;

        //    y = ClampAngle(y, yRoatationMinLimit, yRoatationMaxLimit);

        //    transform.Rotate(y, x, 0);

        //    var angles = transform.eulerAngles;
        //    angles.z = 0;

        //    transform.eulerAngles = angles;
        //}

        //鼠标滑轮
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            var moveDistance = Input.GetAxis("Mouse ScrollWheel") * ScaleSpeed;

            var position = transform.position;
            position += transform.TransformDirection(Vector3.forward).normalized * moveDistance;

            movePosition(position);
        }

        if (Input.GetKey(ForwardKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.forward).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(BackKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.back).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(LeftKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.left).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(RightKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.right).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(ForwardKey) || Input.GetKey(BackKey) || Input.GetKey(LeftKey) || Input.GetKey(RightKey))
        {
            KeyboardMoveSpeed += KeyboardMoveAcceleratedSpeed * 0.02f;
        }
        else
        {
            KeyboardMoveSpeed = DefaultKeyboardMoveSpeed;
        }

        if (Vector3.Distance(transform.position, Vector3.zero) > MaxMoveDistance)
        {
            movePosition(oldPos + oldPos.normalized * -100);
        }
    }

    void movePosition(Vector3 moveToPosition)
    {
        if (transform.GetComponent<Rigidbody>())
        {
            if (!Physics.Raycast(transform.position, moveToPosition - transform.position, (moveToPosition - transform.position).magnitude))
            {
                transform.GetComponent<Rigidbody>().MovePosition(moveToPosition);
            }
        }
    }

    float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

代码主要功能就是控制是摄像机的视角的缩放与扩大、视角平移、视角旋转 主要控制的代码:

void movePosition(Vector3 moveToPosition)
    {
        if (transform.GetComponent<Rigidbody>())
        {
            if (!Physics.Raycast(transform.position, moveToPosition - transform.position, (moveToPosition - transform.position).magnitude))
            {
                transform.GetComponent<Rigidbody>().MovePosition(moveToPosition);
            }
        }
    }

很明显是控制是摄像机的Rigidbody来实现移动的 所以在摄像机上不仅要加上上面这一段代码,而且还要加上Rigidbody组件才能有效果 然后代码的参数都可以修改 如果修改不了可以把下面的代码注释掉 private void Update() { Vector3 intos = gameObject.transform.position; if (intos.y<-5600) { moveSpeed = 80f; ScaleSpeed = 30f; } else if (intos.y >-5600) { moveSpeed = 800f; ScaleSpeed = 3000f; } } OK 感觉没有什么要注释的了 复用性很高 值得借鉴哦

764424567wechat 764424567qq 764424567alipay