Unity3D魔兽世界视角

using UnityEngine;
using System.Collections;

///
///将此脚本附加到任意镜头上,可以使其拥有WOW镜头的控制方式
/// 
public class WowCamera: MonoBehaviour
{

    ///镜头的目标-player
    /// 
    private Transform _target;
    
    ///镜头离目标的距离 
    /// 
    public float Distance = 17.0f;
    
    ///最小镜头距离
    /// 
    public float MinDistance = 3.0f;

    ///最大镜头距离
    /// 
    public float MaxDistance = 30.0f;
    
    //鼠标滚轮拉近拉远速度系数
    public float ScrollFactor = 10.0f;

    ///左右旋转速度可以快一点
    ///
    public float RotateFactorX = 10.0f;

    ///上下旋转速度可以慢一点
    /// 
    public float RotateFactorY = 0.5f;

    //镜头水平环绕角度
    public float HorizontalAngle = 0;
    
    //镜头竖直环绕角度 
    public float VerticalAngle = 20;
    
    public float MaxVerticalAngle = 30;
    
    public float MinVerticalAngle = 6;

    private Transform _cameraTransform;
    
    void Start()
    {
        _cameraTransform = transform;

        _target = GameObject.FindGameObjectWithTag ( Tags.Player ).transform;
        
        if ( _target == null)
        {
            Debug.Log ( "Target Object Not Exist");
        }
    }


    void Update()
    {
        Distance -= Input.GetAxis ("Mouse ScrollWheel") * ScrollFactor;
        Distance = ( Distance < MinDistance ) ? MinDistance : Distance;
        Distance = ( Distance > MaxDistance ) ? MaxDistance : Distance;

        //按住鼠标左右键移动,镜头随之旋转
        var isMouseLeftButtonDown = Input.GetMouseButton(0);
        var isMouseRightButtonDown = Input.GetMouseButton(1);

        if (isMouseLeftButtonDown || isMouseRightButtonDown)
        {
            //水平旋转和上下旋转
            Screen.lockCursor = true;
            var axisX = Input.GetAxis( "Mouse X" );
            var axisY = Input.GetAxis( "Mouse Y" );
            HorizontalAngle += axisX * RotateFactorX;
            VerticalAngle += axisY * RotateFactorY;
            VerticalAngle = ( VerticalAngle < MinVerticalAngle ) ? MinVerticalAngle : VerticalAngle;
            VerticalAngle = ( VerticalAngle > MaxVerticalAngle ) ? MaxVerticalAngle : VerticalAngle;


            if (isMouseRightButtonDown)
            {
                //如果是鼠标右键移动,则旋转人物在水平面上与镜头方向一致
                _target.rotation = Quaternion.Euler(0, HorizontalAngle, 0);
            }
        }
        else
        {
            Screen.lockCursor = false;
        }

        ///按镜头距离调整位置和方向
        var rotation = Quaternion.Euler(VerticalAngle, HorizontalAngle, 0);
        var offset = rotation * Vector3.back * Distance;
        _cameraTransform.position = _target.position + offset;
        _cameraTransform.rotation = rotation;
    }
}

 

posted @ 2016-09-22 18:05  孤火  阅读(621)  评论(0编辑  收藏  举报