Unity 实战【跳一跳】

【介绍】

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


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();

        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 实战【跳一跳】)