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

摘自FXMaker插件

// ----------------------------------------------------------------------------------
// 摄像头控制
// FXMaker
// Created by ismoon - 2012 - [email protected]
//
// ----------------------------------------------------------------------------------

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);
    }
}
时间: 2024-08-29 11:55:08

摄像机移动 ,旋转控制脚本的相关文章

unity 调整摄像机视角完整脚本

脚本作为组件挂在摄像机上即可,调用接口开关IsControlMove,控制是否启用: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class CameraMove : MonoBehaviour { //public Transform target; public Vector3 target; priv

各种Camera

根据游戏类型的不一样,会需要各种各样的摄像机,下面将分享三种典型的摄像机类型:(1)地下城摄像机:(2)第三人称跟随摄像机:(3)鼠标控制旋转摄像机.将这些控制脚本拖动到场景的MainCamera上即可: 看向固定目标的Camera的基本实现,主要使用transform.LookAt函数来实现: public class LookAtCamera : MonoBehaviour { public GameObject target = null; void LateUpdate() { if (

Unity3d 性能优化遐想 OnBecameVisible/OnBecameInvisible

当玩家在主城中行走时,周围大量玩家显示在玩家周围,不管是玩家能看到的前方,还是看不到的后方,所有的人物模型都在进行着脚本运算. 在OpenGL中 提供了裁剪功能,不在视口范围内的点和面会被裁剪掉以减少渲染代价,在Unity中也顺势提供了相关的API,提供物体进入/离开 视口的函数回调. 文章转自http://blog.csdn.net/huutu   http://www.thisisgame.com.cn OnBecameVisible/OnBecameInvisible 当物体进入视口,触发

Unity学习笔记 之 触发Unity UI 的 Button 事件 的代码记录

首先奉献上 Button 所触发的事件 的脚本代码. 文件名为testButtonEvent using UnityEngine; using System.Collections; //1.引入 UI . using UnityEngine.UI; public class testButtonEvent : MonoBehaviour { //2.定义一个目标对象. public Text targetTextObject; // Use this for initialization vo

Unity3D之Legacy动画系统学习笔记

Unity3D的Mecanim动画系统是非常强大的,而且作为Unity推荐的动画系统,其未来会完全代替老的一套动画系统,即Legacy动画系统.目前的情况是Mecanim与Legacy两套动画系统同时共存,但是并不是说Legacy动画系统就没有任何价值了,作为Unity4.0以前使用的动画系统,我认为还是很有必要去了解和学习的,所以就有了这篇笔记. Legacy动画系统 http://docs.unity3d.com/Manual/Animations.html 我们可以使用Unity自带的资源

【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放

前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋转,实际上是镜头的旋转.模型的缩放实际上是镜头Z轴方向的坐标.那么实现本章的内容只需要控制镜头的位置方可实现. 我们创建一个简单的游戏平面, 然后平面中放一个箱子做为旋转缩放的参照物.如下图所示,选中摄像机,给摄像机添加一个脚本名称为Move. 脚本中有一个参数 Target,它的作用是设置摄像头旋

关于用暴风SDK在unity中加入VR效果和利用暴风手柄进行操作

首先在暴风魔镜开发平台下载SDK.地址:http://open.mojing.cn/sdk/download?pid=2  下载unity的工具 MojingSDK., 然后我用的是unity5.42的版本然后将SDK导入unity中.文件夹中包含 接口说明文档说的也比较清楚. 在unity中搭建一个简单的场景需要放入Prefab的MojingMain.并将场景摄像机放入其中并挂上MojingEye脚本 Eye枚举选项为Center 并且添加prefab Overlay. 如果要进行手柄UI交互

unity学习笔记

monoDevelop乱码问题 这个问题坑了爹很久... unity自带的monodevelop的项目视图在我电脑(win7)上一直乱码,项目名称,项目结构树,以及文件名称全部显示成方框,今天调了下字体,把默认字体改成Consolas,无心插柳解决了这个问题... 见图片 关于Unity的一些概念和语法 最近一直在利用空闲时间看Unity的API,看的比较细但是实际操作的比较少,昨天有一整天的空闲时间,再加上有了一个还不错的想法,想要把它实现出来,因为用到的模型并不复杂,不需要用到建模软件,也不

Unity3d游戏开发之monoDevelop乱码问题

unity自带的monodevelop的项目视图在我电脑(win7)上一直乱码,项目名称,项目结构树,以及文件名称全部显示成方框,今天调了下字体,把默认字体改成Consolas,无心插柳解决了这个问题... 另外找半天没找见改代码编辑器字体的选项,不知道在哪可以改编辑器字体?哪位知情的同学请告诉我. 关于Unity的一些概念和语法 最近一直在利用空闲时间看Unity的API,看的比较细但是实际操作的比较少,昨天有一整天的空闲时间,再加上有了一个还不错的想法,想要把它实现出来,因为用到的模型并不复