• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Unity根底包 FirstPersonController下的MouseLook 脚本研讨

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/1006/672.html

 
 
 
 
今天常州微信小程序开发赋析了一下MouseLook,主要是处置人物和镜头的旋转:
[csharp] view plain copy 
public class MouseLook  
{  
    public float XSensitivity = 2f; //x轴和y轴的灵活度  
    public float YSensitivity = 2f;  
 
    public bool clampVerticalRotation = true;   //能否锁定x轴的旋转角度,旋转的解释见下  
    public float MinimumX = -90F;   //锁定的最小、最大角度  
    public float MaximumX = 90F;  
 
    public bool smooth; //能否运用插值运算  
    public float smoothTime = 5f;   //插值的时间  
 
    public bool lockCursor = true;  //能否要检测锁定指针  
 
 
    private Quaternion m_CharacterTargetRot;    //角色和相机的目的旋转角度  
    private Quaternion m_CameraTargetRot;  
 
    private bool m_cursorIsLocked = true;   //当前鼠标指针能否锁定,只要lockCursor为true的时分,该值才会有效  
 
    // 初始化,传入角色和相机的旋转角度  
    public void Init(Transform character, Transform camera)  
    {  
        m_CharacterTargetRot = character.localRotation; //角色的旋转角度  
        m_CameraTargetRot = camera.localRotation;   //相机的旋转角度  
    }  
 
    // FirstPersonController每帧会调用  
    // 依据鼠标挪动的位置调整镜头的旋转  
    public void LookRotation(Transform character, Transform camera)  
    {  
        // 获取鼠标的位置,乘以灵活度,获取x轴y轴的旋转  
        // 留意这边的位置是相对位置,也就是这一帧和上一帧的相对挪动位置  
        float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;     
        float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;  
 
        // 旋转,y轴旋转角色,x轴旋转镜头,也就是说横向的旋转是旋转的角色,而纵向的旋转是旋转镜头。  
        // 这里常州网站开发建设有个益处,就是镜头Camera节点是在FPC节点下面的,所以旋转了角色的同时也会旋转镜头,同时统筹了旋转角色的正方向。  
        // 而纵向的旋转,其实对实践角色而言没有任何影响,所以只需旋转镜头即可,这种分层次的旋转非常有用。  
        m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);    //然后说一下这边API的运用,大家刚看到一个乘法,可能跟我一样有些懵逼,不过这边乘以一个欧拉角,相当于旋转增加该值,而增加的就是Transform面板上Rotation的值了,所以要运用面板Rotation值的话一定要记住运用欧拉角,而不是普通的创立,普通的创立那是四元数  
        m_CameraTargetRot *= Quaternion.Euler(-xRot, 0f, 0f);  
 
        // 锁定x轴的旋转角度  
        if(clampVerticalRotation)  
            m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);  
 
        if(smooth)  //运用插值运算平滑旋转速度,不过我翻开了觉得头晕,不晓得为什么。第三人称用这类插值运算应该很舒适。  
        {  
            // Slerp运用球形停止插值  
            character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot,  
                smoothTime * Time.deltaTime);  
            camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot,  
                smoothTime * Time.deltaTime);  
        }  
        else     //直接赋值  
        {  
            character.localRotation = m_CharacterTargetRot;  
            camera.localRotation = m_CameraTargetRot;  
        }  
 
        UpdateCursorLock();  
    }  
 
    public void SetCursorLock(bool value)  
    {  
        lockCursor = value;  
        if(!lockCursor)  
        {  
            // 假如用户主动设置lockCursor,即InternalLockUpdate不会影响能否锁定指针,则我们强迫解锁指针  
            // 也就是说,lockCursor为true时快捷键影响锁定指针,lockCursor为false的时分快捷键不影响,并强迫不锁指针  
            Cursor.lockState = CursorLockMode.None;  
            Cursor.visible = true;  
        }  
    }  
 
    // 鼠标指针锁定有关,FirstPersonController的Update中会调用一次外,MouseLook的LookRotation中也会调用一次  
    public void UpdateCursorLock()  
    {  
        //假如设置lockCursor,则检查确认能否要锁定指针  
        if (lockCursor)  
            InternalLockUpdate();  
    }  
 
    private void InternalLockUpdate()  
    {  
        if(Input.GetKeyUp(KeyCode.Escape))  //按下esc,退出指针锁定  
        {  
            m_cursorIsLocked = false;  
        }  
        else if(Input.GetMouseButtonUp(0))  //按下鼠标左键,指针锁定  
        {  
            m_cursorIsLocked = true;  
        }  
 
        if (m_cursorIsLocked)  
        {  
            Cursor.lockState = CursorLockMode.Locked;   //指针状态变为锁定  
            Cursor.visible = false; //并躲藏  
        }  
        else if (!m_cursorIsLocked)  
        {  
            Cursor.lockState = CursorLockMode.None; //释放鼠标指针  
            Cursor.visible = true;  
        }  
    }  
 
    // 锁定镜头的旋转角度,镜头只跟X轴旋转有关  
    Quaternion ClampRotationAroundXAxis(Quaternion q)  
    {  
        // 嗯,游戏开发运营网上看了半天的四元数,没太了解就不强行解释了,等过段时间研讨一下矩阵和四元数  
        q.x /= q.w;  
        q.y /= q.w;  
        q.z /= q.w;  
        q.w = 1.0f;  
 
        float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.x);  
 
        angleX = Mathf.Clamp (angleX, MinimumX, MaximumX);  
 
        q.x = Mathf.Tan (0.5f * Mathf.Deg2Rad * angleX);  
 
        return q;  
    }  
 
}  
 
 
OK,我会继续剖析根底包中剩下的代码的,同时也会加把劲把Unity书中根底局部给刷掉。
 

上篇:上一篇:Unity的WWW类的用法整顿
下篇:下一篇:unity3d中上下左右键控制挪动