【介绍】
模仿微信跳一跳 实现蓄力跳动物体展示不同的结果页面,下面为运行效果
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
蓄力效果则在蓄力的过程中 修改stage
和player
的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();
}
}
}
网友评论