美文网首页
Unity 实战【跳一跳】

Unity 实战【跳一跳】

作者: 程序员阿兵 | 来源:发表于2022-08-16 09:14 被阅读0次

    【介绍】

    模仿微信跳一跳 实现蓄力跳动物体展示不同的结果页面,下面为运行效果


    73B11E40-8B33-490E-9F08-54BC45CCB642.gif

    将项目可拆解成以下几个模块:

    1.添加场景以及玩家
    2.跳跃
    3.玩家蓄力
    4.跳一跳成功以及失败的状态

    • 1.添加游戏素材
      创建场地Ground设置场地大小为1000*1000
      image.png
      创建玩家player 分body和Head 在一个父节点下面
      image.png
      创建台面stage 台面的长宽高分别为2 2 1 将palyer 挪到台面上
      image.png
    • 2.跳跃
      跳跃的api 可以使用AddForce(x,y,z) 使模型对应跳起


      image.png

      可以看到上面Vector3(0,10,10) 则为向上且向前方跳跃。
      初步实现脚本如下:


      image.png
      image.png

    运行完效果如上 会发现player 会摔倒在地上

    image.png image.png
    首先需要把模型的碰撞体改成BoxCollider image.png

    然后修改质心的位置 这样就会稳稳的落地了。

    • 3.蓄力
      蓄力的逻辑相对很简单 就是按下空格键记录当前时间 抬起时再次记录。两次时间间隔产生偏移差值。
      image.png
      蓄力效果则在蓄力的过程中 修改stageplayer的scale 缩放比
       // Update is called once per frame
        void Update()
        {
            // 按开 Space 键
            if(Input.GetKeyDown(KeyCode.Space))
            {
                startTime = Time.time;
    
                //
                playerScale = transform.localScale;
                stageScale = stage.transform.localScale;
            }
    
            // 松开 Space键
            if (Input.GetKeyUp(KeyCode.Space))
            {
                float t = Time.time - startTime;
    
                Vector3 v = new Vector3();
                v.x = 0;
                v.y = jumpSpeed.y * t * 0.9f;
                // if (v.y > 6) v.y = 6;
                v.z = jumpSpeed.z * t * 1.1f;
    
                rb.AddForce(v, ForceMode.VelocityChange);
    
                //
                transform.localScale = playerScale;
                stage.transform.localScale = stageScale;
            }
    
            if(Input.GetKey(KeyCode.Space))
            {
                // 下压效果
                float t = Time.time - startTime;
    
                // float deltaScale = 0.1f * t;
                Vector3 delta = new Vector3();
                delta.x = delta.z = 0.5f * t;
                delta.y = 0.1f * t;
    
                transform.localScale = playerScale - new Vector3(-delta.x, delta.y, -delta.z);
    
                stage.transform.localScale = stageScale - new Vector3(-delta.x, delta.y, -delta.z);
            }
    
        }
    
    
    • 4.跳一跳成功以及失败的状态
      再添加一个stage跳台可以control+D 再复制一个stage2
      image.png

    在玩家按住空格键player 则跳起 挑起的结果为:1.和stage1台面碰撞 2.和地面碰撞 3.和stage2台面碰撞
    所以可以在player 的碰撞OnCollisionEnter事件中进行处理不同的结果页面

      private void OnCollisionEnter(Collision collision)
        {
            GameObject other = collision.gameObject;
    
            if(other == nextStage)
            {
                Debug.Log("恭喜通关!");
                UiManager.Instance.OnGameWin();
            }
            else if(other == ground)
            {
                Debug.Log("失败!按R再来一次");
                UiManager.Instance.OnGameLose();
            }
        }
    

    Player脚本的整体代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        Rigidbody rb;
    
        // 初速度 
        public Vector3 jumpSpeed;
    
        // 按下Space键的时间
        float startTime;
    
        // 原始的 Scale
        Vector3 playerScale; // Player的原始 Scale
        Vector3 stageScale; // Stage的原始 Scale
    
        public GameObject stage; // Stage台子
        public GameObject nextStage; // 下一个台阶
        public GameObject ground; // 地面
    
        // Start is called before the first frame update
        void Start()
        {
            rb = GetComponent<Rigidbody>();
    
            rb.centerOfMass = new Vector3(0, 0, 0); 
    
        }
    
        // Update is called once per frame
        void Update()
        {
            // 按开 Space 键
            if(Input.GetKeyDown(KeyCode.Space))
            {
                startTime = Time.time;
    
                //
                playerScale = transform.localScale;
                stageScale = stage.transform.localScale;
            }
    
            // 松开 Space键
            if (Input.GetKeyUp(KeyCode.Space))
            {
                float t = Time.time - startTime;
    
                Vector3 v = new Vector3();
                v.x = 0;
                v.y = jumpSpeed.y * t * 0.9f;
                // if (v.y > 6) v.y = 6;
                v.z = jumpSpeed.z * t * 1.1f;
    
                rb.AddForce(v, ForceMode.VelocityChange);
    
                //
                transform.localScale = playerScale;
                stage.transform.localScale = stageScale;
            }
    
            if(Input.GetKey(KeyCode.Space))
            {
                // 下压效果
                float t = Time.time - startTime;
    
                // float deltaScale = 0.1f * t;
                Vector3 delta = new Vector3();
                delta.x = delta.z = 0.5f * t;
                delta.y = 0.1f * t;
    
                transform.localScale = playerScale - new Vector3(-delta.x, delta.y, -delta.z);
    
                stage.transform.localScale = stageScale - new Vector3(-delta.x, delta.y, -delta.z);
            }
    
        }
    
        private void OnCollisionEnter(Collision collision)
        {
            GameObject other = collision.gameObject;
    
            if(other == nextStage)
            {
                Debug.Log("恭喜通关!");
                UiManager.Instance.OnGameWin();
            }
            else if(other == ground)
            {
                Debug.Log("失败!按R再来一次");
                UiManager.Instance.OnGameLose();
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Unity 实战【跳一跳】

          本文链接:https://www.haomeiwen.com/subject/nvnkgrtx.html