• 【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测


    《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示
    鼠标观察/键盘控制移动飞行/行走/碰撞检测
    Unity版本:2019.4.23f1c1

    • 注意脚本名称和组件添加,不在文章中一一强调
    • 场景模型都是在资源商店选择的免费下载(选择Sort by Price(Low to High)排序)搜索参考关键字:airplane、sky
    • 整篇的实例代码是修改累加的,为了防止混乱我就全部贴上,不强调新增或删减部分

    搭建:一架飞机模型(脚本挂载物体),天空盒(照明设置),摄像机Camera
    原始画面:
    在这里插入图片描述

    跟随鼠标观察周围脚本

    运行效果:

    在这里插入图片描述
    如果改为鼠标X则只能水平旋转(我这里是摄像机角度有些倾斜,不是飞机
    在这里插入图片描述
    在这里插入图片描述

    using UnityEngine;
    using System.Collections;
    
    public class MouseLook : MonoBehaviour
    {
        //观察周围
        public enum RotationAxes
        {
            MouseXAndY=0,
            MouseX=1,
            MouseY=2
        }
        public RotationAxes axes = RotationAxes.MouseXAndY;
    
        public float sensitivityHor = 9.0f;//旋转速度
        public float sensitivityVert = 9.0f;
    
        public float miniumVert = -45.0f;
        public float maximumVert = 45.0f;
    
        private float _rotationX = 0;
        
        void Start()
        {
            Rigidbody body = GetComponent<Rigidbody>();
            if (body != null)
                body.freezeRotation = true;
        }
    
        // Update is called once per frame
        void Update()
        {
            if (axes == RotationAxes.MouseX)//水平旋转
            {
                transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);//GetAxis()获取鼠标的输入
            }
            else if (axes == RotationAxes.MouseY)//垂直旋转
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;//基于鼠标增加垂直角度
                _rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);//将垂直角度限制在最小值和最大值之间
    
                float rotationY = transform.localEulerAngles.y;//保持Y的角度一样(也就是水平没有旋转)
    
                transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);//使用存储旋转值创建新的Vector
            }
            else//水平且垂直旋转
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);
    
                float delta = Input.GetAxis("Mouse X") * sensitivityHor;//旋转变化量
                float rotationY = transform.localEulerAngles.y + delta;//使用delta增加旋转角度
    
                transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    第一人称控件

    在这里插入图片描述

    运行效果:键盘WSAD或上下左右,鼠标移动水平高度
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    
    //using System.Collections.Generic;
    using UnityEngine;
    using System.Collections;
    
    public class FPS : MonoBehaviour
    {
        public float speed = 3.0f;
        //观察周围
        public enum RotationAxes
        {
            MouseXAndY = 0,
            MouseX = 1,
            MouseY = 2
        }
        public RotationAxes axes = RotationAxes.MouseXAndY;
    
        public float sensitivityHor = 9.0f;//旋转速度
        public float sensitivityVert = 9.0f;
    
        public float miniumVert = -45.0f;
        public float maximumVert = 45.0f;
    
        private float _rotationX = 0;
    
        void Start()
        {
            Rigidbody body = GetComponent<Rigidbody>();
            if (body != null)
                body.freezeRotation = true;
        }
    
        // Update is called once per frame
        void Update()
        {
            if (axes == RotationAxes.MouseX)//水平旋转
            {
                transform.Translate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);//GetAxis()获取鼠标的输入
            }
            else if (axes == RotationAxes.MouseY)//垂直旋转
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;//基于鼠标增加垂直角度
                _rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);//将垂直角度限制在最小值和最大值之间
    
                float rotationY = transform.localEulerAngles.y;//保持Y的角度一样(也就是水平没有旋转)
    
                transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);//使用存储旋转值创建新的Vector
            }
            else//水平且垂直旋转
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, miniumVert, maximumVert);
    
                float delta = Input.GetAxis("Mouse X") * sensitivityHor;//旋转变化量
                float rotationY = transform.localEulerAngles.y + delta;//使用delta增加旋转角度
    
                transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
            }
            float deltaX = Input.GetAxis("Horizontal") * speed;
            float deltaZ = Input.GetAxis("Vertical") * speed;
            transform.Translate(deltaX, 0, deltaZ);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    碰撞检测

    问题:如果前面有一堵墙飞机往前会直接穿过去
    在这里插入图片描述

    运行效果:碰到墙壁无法穿过
    在这里插入图片描述

    在这里插入图片描述

    
    //using System.Collections.Generic;
    using UnityEngine;
    using System.Collections;
    
    public class FPS : MonoBehaviour
    {
        public float speed = 3.0f;
        private CharacterController _charController;
    
        void Start()
        {
            _charController = GetComponent<CharacterController>();
        }
    
        // Update is called once per frame
        void Update()
        {
    
            float deltaX = Input.GetAxis ("Horizontal") * speed;
            float deltaZ = Input.GetAxis ("Vertical") * speed;
            Vector3 movement = new Vector3 (deltaX, 0, deltaZ);
            movement = Vector3.ClampMagnitude (movement, speed);
    
            movement *= Time.deltaTime;
            movement = transform.TransformDirection  (movement);
            _charController.Move (movement);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    重力添加

    添加重力gravity就能改为陆地行走,在面板将重力改为0则飞行模式
    在这里插入图片描述

    using System.Collections;
    using UnityEngine;
    
    [RequireComponent(typeof(CharacterController))]
    [AddComponentMenu("Control Script/FPS Input")]
    public class FPS : MonoBehaviour
    {
        public float speed = 6.0f;
        public float gravity = -9.8f;
    
        private CharacterController _charController;
        // Start is called before the first frame update
        void Start()
        {
            _charController = GetComponent<CharacterController>();
        }
    
        // Update is called once per frame
        void Update()
        {
            float deltaX = Input.GetAxis("Horizontal") * speed;
            float deltaZ = Input.GetAxis("Vertical") * speed;
            Vector3 movement = new Vector3(deltaX, 0, deltaZ);
            movement = Vector3.ClampMagnitude(movement, speed);
    
            movement.y = gravity;
    
            movement *= Time.deltaTime;
            movement = transform.TransformDirection(movement);
            _charController.Move(movement);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    【891. 子序列宽度之和】
    bootstrap学习:bootstrap复习
    Windows安装多Java版本快速切换
    目标检测网络系列——YOLO V2
    招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本
    PTA题目 奇偶分家
    【牛客网-公司真题-前端入门篇】——奇安信春招笔试-前端-卷2
    efcore事务
    【吴恩达机器学习-笔记整理】降维,数据压缩与PCA
    java设计模式---建造者模式
  • 原文地址:https://blog.csdn.net/Liuees/article/details/134292965