Unity 实战【跳一跳】

2022-08-16  本文已影响0人  程序员阿兵

【介绍】

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


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

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

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

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

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

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

   // 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);
        }

    }

在玩家按住空格键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();
        }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读