摄像机移动 ,旋转控制脚本

 

 

摘自FXMaker插件

// ----------------------------------------------------------------------------------
// 摄像头控制
// FXMaker
// Created by ismoon - 2012 - ismoonto@gmail.com
//
// ----------------------------------------------------------------------------------

using UnityEngine;

public class FxmTestMouse : MonoBehaviour
{
    // Attribute ------------------------------------------------------------------------
    public        Transform    m_TargetTrans;
    public        Camera        m_GrayscaleCamara;
    public        Shader        m_GrayscaleShader;

    protected    bool        m_bRaycastHit;
    protected    const float    m_fDefaultDistance    = 8.0f;
    protected    const float    m_fDefaultWheelSpeed= 5.0f;
    public        float        m_fDistance            = m_fDefaultDistance;
    public        float        m_fXSpeed            = 350.0f;
    public        float        m_fYSpeed            = 300.0f;
    public        float        m_fWheelSpeed        = m_fDefaultWheelSpeed;

    public        float        m_fYMinLimit        = -90f;
    public        float        m_fYMaxLimit        = 90f;
   
    public        float        m_fDistanceMin        = 1.0f;
    public        float        m_fDistanceMax        = 50;

    public        int            m_nMoveInputIndex    = 1;
    public        int            m_nRotInputIndex    = 0;
 
    public        float        m_fXRot                = 0.0f;
    public        float        m_fYRot                = 0.0f;

    // HandControl
    protected    bool        m_bHandEnable        = true;
    protected    Vector3        m_MovePostion;
    protected    Vector3        m_OldMousePos;
    protected    bool        m_bLeftClick;
    protected    bool        m_bRightClick;

    // -----------------------------------------------------------------
    public void ChangeAngle(float angle)
    {
        m_fYRot            = angle;
        m_fXRot            = 0;
        m_MovePostion    = Vector3.zero;
    }

    public void SetHandControl(bool bEnable)
    {
        m_bHandEnable = bEnable;
    }

    public void SetDistance(float fDistance)
    {
        m_fDistance = fDistance;
        PlayerPrefs.SetFloat("FxmTestMouse.m_fDistance", m_fDistance);
        UpdateCamera(true);
    }

    // -----------------------------------------------------------------
    void OnEnable()
    {
        m_fDistance    = PlayerPrefs.GetFloat("FxmTestMouse.m_fDistance", m_fDistance);
    }

    void Start()
    {
        if (Camera.mainCamera == null)
            return;

//         Vector3 angles = Camera.mainCamera.transform.eulerAngles;
//         m_fXRot = angles.y;
//         m_fYRot = angles.x;

        // Make the rigid body not change rotation
        if (rigidbody)
            rigidbody.freezeRotation = true;
    }

    bool IsGUIMousePosition()
    {
        Vector2 pos = NgLayout.GetGUIMousePosition();
        if (FxmTestMain.inst.GetFXMakerControls().GetActionToolbarRect().Contains(pos))
            return true;
        if (new Rect(0, 0, Screen.width, Screen.height/10+30).Contains(pos))
            return true;
        if (new Rect(0, 0, 40, Screen.height).Contains(pos))
            return true;
        return false;
    }

    void Update()
    {
        if (IsGUIMousePosition() && (m_bLeftClick == false && m_bRightClick == false))
            return;

        UpdateCamera(false);
    }

    public void UpdateCamera(bool bOnlyZoom)
    {
        if (Camera.mainCamera == null)
            return;

        if (m_fWheelSpeed < 0)
            m_fWheelSpeed = m_fDefaultWheelSpeed;

        float fDistRate        = m_fDistance / m_fDefaultDistance;
        float fOldDistance    = m_fDistance;

        if (m_TargetTrans)
        {
            m_fDistance = Mathf.Clamp(m_fDistance - Input.GetAxis("Mouse ScrollWheel")*m_fWheelSpeed*fDistRate, m_fDistanceMin, m_fDistanceMax);

            // 오소방식이면.. 화면 사이즈를 조정하자
            if (Camera.mainCamera.orthographic)
            {
                Camera.mainCamera.orthographicSize = m_fDistance*0.60f;
                if (m_GrayscaleCamara != null)
                    m_GrayscaleCamara.orthographicSize = m_fDistance*0.60f;
            }

            if (!bOnlyZoom && m_bRightClick && Input.GetMouseButton(m_nRotInputIndex))
            {
                m_fXRot += Input.GetAxis("Mouse X") * m_fXSpeed * 0.02f;// * m_fDistance * 0.02f;
                m_fYRot -= Input.GetAxis("Mouse Y") * m_fYSpeed * 0.02f;
            }

            if (!bOnlyZoom && Input.GetMouseButtonDown(m_nRotInputIndex))
                m_bRightClick    = true;
            if (!bOnlyZoom && Input.GetMouseButtonUp(m_nRotInputIndex))
                m_bRightClick    = false;

            m_fYRot = ClampAngle(m_fYRot, m_fYMinLimit, m_fYMaxLimit);
           
            Quaternion rotation = Quaternion.Euler(m_fYRot, m_fXRot, 0);
     
            if (m_bRaycastHit)
            {
                RaycastHit hit;
                if (Physics.Linecast (m_TargetTrans.position, Camera.mainCamera.transform.position, out hit)) {
                        m_fDistance -=  hit.distance;
                }
            }

            Vector3 negDistance = new Vector3(0.0f, 0.0f, -m_fDistance);
            Vector3 position = rotation * negDistance + m_TargetTrans.position;
     
            Camera.mainCamera.transform.rotation = rotation;
            Camera.mainCamera.transform.position = position;
            UpdatePosition(Camera.mainCamera.transform);
            if (m_GrayscaleCamara != null)
            {
                m_GrayscaleCamara.transform.rotation = Camera.mainCamera.transform.rotation;
                m_GrayscaleCamara.transform.position = Camera.mainCamera.transform.position;
            }

            // save
            if (fOldDistance != m_fDistance)
                PlayerPrefs.SetFloat("FxmTestMouse.m_fDistance", m_fDistance);
        }
    }

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

    void UpdatePosition(Transform camera)
    {
        if (m_bHandEnable)
        {
            if (Input.GetMouseButtonDown(m_nMoveInputIndex))
            {
                m_OldMousePos    = Input.mousePosition;
                m_bLeftClick    = true;
            }

            if (m_bLeftClick && Input.GetMouseButton(m_nMoveInputIndex))
            {
                Vector3 currMousePos    = Input.mousePosition;
                float    worldlen        = NgLayout.GetWorldPerScreenPixel(m_TargetTrans.transform.position);
                
                m_MovePostion += (m_OldMousePos - currMousePos) * worldlen;
                m_OldMousePos = currMousePos;
            }
            if (Input.GetMouseButtonUp(m_nMoveInputIndex))
                m_bLeftClick = false;
        }

        camera.Translate(m_MovePostion, Space.Self);
    }
}

 

转载于:https://www.cnblogs.com/tunging/p/4095607.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值