YLGameCameraControl

来源:互联网 发布:csgo低配置优化补丁 编辑:程序博客网 时间:2024/06/01 08:14
鼠标右键控制目标物体(target)转动,鼠标滚轮控制前移和后移

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

public class CameraTest : MonoBehaviour {
    private float x;
    private float y;

    public Transform target;

    /// <summary>
    /// 水平转动角度
    /// </summary>
    public float thetaSpeed = 30;
    /// <summary>
    /// 垂直转动角度
    /// </summary>
    public float phiSpeed = 10;
    /// <summary>
    /// 纵向向下限制转动角度
    /// </summary>
    public float minVAngle = -89;
    /// <summary>
    /// 纵向向上限制转动角度
    /// </summary>
    public float maxVAngle = 89;
    /// <summary>
    /// 转动角度灵敏度
    /// </summary>
    public float angleSensitivity = 1;

    /// <summary>
    /// 滑动轮滑动距离
    /// </summary>
    public float mouseScrollSpeed = 3;
    /// <summary>
    /// 摄像机与目标物体间的距离
    /// </summary>
    public float distance;
    /// <summary>
    /// 滑动最近距离
    /// </summary>
    public float minDistance = 3;
    /// <summary>
    /// 滑动最远距离
    /// </summary>
    public float maxDistance = 18;

    // Use this for initialization
    void Start () {
        x = transform.eulerAngles.y;
        y = transform.eulerAngles.x;

        distance = Vector3.Distance(transform.position , target.position);

        //初始化摄像机的位置,通过目标物体的位置以及欧拉角、距离等关系确定初始位置  
        transform.position = target.position - Quaternion.Euler(y, x, 0) * Vector3.forward * distance;
    }

    void FixedUpdate() {
        CameraZoom();
        CameraRotate();
    }

    void CameraRotate() {
        if (target != null && Input.GetMouseButton(1))
        {
            x += Input.GetAxis("Mouse X") * thetaSpeed * 0.1f;
            y += Input.GetAxis("Mouse Y") * phiSpeed * 0.1f;

            y = ClampAngle(y, minVAngle, maxVAngle);
            Quaternion rotation = Quaternion.Euler(y, x, 0);
            Vector3 direction = rotation * Vector3.forward;
            transform.position = target.position - direction * distance;
            transform.LookAt(target);

            Cursor.visible = false;
            /*不添加LookAt,摄像机不能始终朝向物体,摄像机可以自由滑动但不朝向目标物体
            transform.rotation = Quaternion.Slerp(rotation, transform.rotation, angleSensitivity);//摄像机绕自身周旋转
            transform.RotateAround(target.position, Vector3.up, thetaSpeed * 0.1f);//点击鼠标,摄像机绕物体平面旋转
            */
        }
        else {
            Cursor.visible = true;
        }
    }

    void CameraZoom() {

        distance -= Input.GetAxis("Mouse ScrollWheel") * mouseScrollSpeed;
        distance = Mathf.Clamp(distance, minDistance, maxDistance);

        if (distance <= minDistance || distance >= maxDistance)
        {
            return;
        }
        transform.position = transform.position + transform.forward * Input.GetAxis("Mouse ScrollWheel") * mouseScrollSpeed;
    }

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

原创粉丝点击