美文网首页
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 实战【跳一跳】

    【介绍】 模仿微信跳一跳 实现蓄力跳动物体展示不同的结果页面,下面为运行效果 将项目可拆解成以下几个模块: 1.添...

  • Unity实现跳一跳,微信跳一跳制作

  • 跳一跳小游戏贴膜使用说明

    还有相关详细文章见以下: 微信跳一跳深度解密(上篇)——隐藏在游戏里的移动轨迹 微信跳一跳深度解密(下篇实战篇):...

  • 仿微信跳一跳Unity项目

    项目源码 Github: https://github.com/tackor/Unity- 百度云盘: https...

  • 微信“跳一跳”,暴露了你的感情危机

    最近,流行着一股“跳一跳”风。 课间休息跳一跳,大脑好放松。 宿舍床上跳一跳,晚上睡的香。 办公室里跳一跳,小心点...

  • 跳一跳

    我这几天在玩小程序里的跳一跳游戏,几番努力都没有儿子跳的步数多。或许是自己太在意,用劲小了掉下去了,用劲大了跳过了...

  • 跳一跳

    有这样一件事,相信大家都知道微信上“跳一跳”这个小程序,有个人每次都能有很高的分数,而另一个人,分数怎么都提不上去...

  • 跳一跳

    在朋友圈问了个问题:玩儿跳一跳的时候你在想什么,一个朋友答说思考人生。 人生我倒没思考,玩儿的时候一直努力让自己专...

  • 跳一跳

  • 跳一跳

网友评论

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

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