zoukankan      html  css  js  c++  java
  • Unity控制角色移动

    Copy代码前的准备工作
    整体结构
    在这里插入图片描述
    建立个空对象命名随意,主要是为了:角色掉出地图时,可以回到空对象的位置
    在这里插入图片描述
    在建立个空对象命名为Player,放到PlayResurrectionPoints子级下,并把Tag设置为Player,方便后续工作
    在这里插入图片描述
    在这里插入图片描述
    把模型放入Player子级下,我就使用胶囊模型当作玩家
    在这里插入图片描述
    我们还需要建立个Camera当作玩家的眼睛,建立在Player下,这还没完,我们还需要把它Tag设置成PlayerCamera
    在这里插入图片描述
    哈哈,找不到是吧,因为我们的项目没有添加,我们需要自己添加,点击Add Tag…
    在这里插入图片描述
    到了这个页面,我们点击右下角的+按钮
    在这里插入图片描述
    输入PlayerCamera,输入完成后点击Save按钮,即可
    在这里插入图片描述
    这些工作都完成了,新建个脚本,自己随便命名,就可以Copy代码下面的完整代码了
    完整代码

    CharacterController playerController;
        Vector3 direction;
    
        [Tooltip("移动速度")]
        public float Movespeed = 3f;
        [Tooltip("冲刺速度")]
        public float Sprintspeed = 5f;
        [Tooltip("跳跃高度")]
        public float jumpPower = 2.2f;
        [Tooltip("重力")]
        public float gravity = 7f;
        [Tooltip("鼠标速度")]
        public float mousespeed = 3f;
        [Tooltip("最高落下不扣血")]
        public float MaxFallNoDamage = 3f;
        [Tooltip("限制最小角度")]
        public float minmouseY = -60f;
        [Tooltip("限制最大角度")]
        public float maxmouseY = 65f;
        GameObject PlayResurrectionPoints;
        float RecordMovespeed;
        float Recordgravity;
        float RotationY = 0f;
        float RotationX = 0f;
        float RecordHeight;
        Transform agretctCamera;
    
        Vector2 m_screenpos = new Vector2();
        // Use this for initialization
        void Start()
        {
            RecordMovespeed = Movespeed;
            Recordgravity = gravity;
            playerController = GetComponent<CharacterController>();
            agretctCamera = GameObject.FindWithTag("PlayerCamera").GetComponent<Transform>();
            PlayResurrectionPoints = GameObject.Find("PlayResurrectionPoints");
            //Cursor.lockState = CursorLockMode.Locked;
        }
    
        // Update is called once per frame
    
        void FixedUpdate()
        {
            if(Input.touchCount == 1)
            {
                if(Input.touches[0].phase == TouchPhase.Began)
                {
                    m_screenpos = Input.touches[0].position;
                }
            }
            //GameObject.Find()
            Debug.Log(m_screenpos);
    
            float _horizontal = Input.GetAxis("Horizontal");
            float _vertical = Input.GetAxis("Vertical");
    
            if (playerController.isGrounded)
            {
                direction = new Vector3(_horizontal, 0, _vertical);
                if (Input.GetKeyDown(KeyCode.Space))
                    direction.y = jumpPower;
                if(RecordHeight - transform.localPosition.y  > MaxFallNoDamage)
                {
    //这里可以写摔伤的函数
                    //这个是得出超出高度的值
                    Debug.Log((RecordHeight - transform.localPosition.y) - MaxFallNoDamage);
                }
                RecordHeight = 0;
            }
            direction.y -= gravity * Time.deltaTime;
            playerController.Move(playerController.transform.TransformDirection(direction * Time.deltaTime * Movespeed));
            RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;
            RotationY -= Input.GetAxis("Mouse Y") * mousespeed;
            RotationY = Mathf.Clamp(RotationY, minmouseY, maxmouseY);
            this.transform.eulerAngles = new Vector3(0, RotationX, 0);
            agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);
    
            //冲刺
            if (Input.GetKey(KeyCode.W) && Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKey(KeyCode.W) && Input.GetKeyDown(KeyCode.RightShift))
            {
                if (Movespeed != Sprintspeed)
                {
                    Movespeed = Sprintspeed;
                    gravity = 12f;
                }
            }
            if (Input.GetKey(KeyCode.LeftShift) && Input.GetKeyDown(KeyCode.W) || Input.GetKey(KeyCode.RightShift) && Input.GetKeyDown(KeyCode.W))
            {
                if (Movespeed != Sprintspeed)
                {
                    Movespeed = Sprintspeed;
                    gravity = 12f;
                }
            }
            if (Input.GetKeyUp(KeyCode.W) && Input.GetKey(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.W) && Input.GetKey(KeyCode.RightShift))
            {
                Movespeed = RecordMovespeed;
                gravity = Recordgravity;
            }
            if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift))
            {
                Movespeed = RecordMovespeed;
                gravity = Recordgravity;
            }
            //如果玩家掉入深渊回到复活点
            if (gameObject.transform.localPosition.y < -50)
            {
                gameObject.transform.position = new Vector3(PlayResurrectionPoints.transform.position.x, PlayResurrectionPoints.transform.position.y, PlayResurrectionPoints.transform.position.z);
            }
    
            //记录高度,玩家是否摔伤
            if(transform.localPosition.y > RecordHeight)
            {
                RecordHeight = transform.localPosition.y;
            }
        }
    

    最后工作
    将脚本放到Player身上,在建立个Character Controller,最后就可以运行了,这些代码都是最基础的功能,我们可以继续把代码完善好
    在这里插入图片描述
    本篇技术文章完成了,如果觉得本技术文章对你有帮助请给我点个赞,如果有什么不足的地方,给我提意见,让我加以改进

  • 相关阅读:
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战
    点滴的积累---J2SE学习小结
    公开课
    iOS学习之 plist文件的读写
    【STL】关联容器 — hash_set
    《Pro Android Graphics》读书笔记之第三节
    第一章. ActionScript 语言基础
    JAVA数组的定义及用法
    MS-SQLSERVER中的MSDTC不可用解决方法
  • 原文地址:https://www.cnblogs.com/LRolinx/p/13850375.html
Copyright © 2011-2022 走看看