抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

总章中间漏了点,最近懒得补。干脆做到哪写到哪吧,有时间再整理。

  • 跳跃在空中的状态是:跳起->下落;

  • 跳起之后松开空格就是下落状态,所以二段跳逻辑我们写在下落状态中;

实现空中多段跳

  • 新建一个空中跳跃状态(PlayerState_AirJump.cs),为他添加资产菜单(CreateAssetMenu);

  • 空中跳跃的逻辑和普通跳跃一样,所以直接复制代码即可。重要的地方在于,我们需要给二段跳进行限制。

PlayerController.cs中,新建属性CanAirJump,public bool CanAirJump { get; set; } = true;//控制空中跳跃能力的开关

在下落状态脚本PlayerState_Fall.cs中的**LogicUpdate()**函数里实现判断,当玩家可以跳跃时(吃到星星,测试时条件是落地后)切换状态:

public override void LogicUpdate()
{
if (player.IsGrounded)
{//当玩家接触到地面时,切换到落地状态
stateMachine.SwitchState(typeof(PlayerState_Land));
}
if (input.playerjump)
{
if (player.CanAirJump)
{//当玩家可以跳跃时(吃到星星,测试时条件是落地后)
stateMachine.SwitchState(typeof(PlayerState_AirJump));
}
}
}

给跳跃添加粒子特效

分别在两个跳跃状态新建[SerializeField] ParticleSystem jumpVFX;//粒子特效

实现吃星星增加跳跃次数

首先

将玩家控制器脚本PlayerController中,属性 public bool CanAirJump { get; set; }的ture赋值删除,不进行初始化.默认值为false;

其次

PlayerState_Land脚本中删除Enter()里,player.CanAirJump

image-20220901163609823

打开星星宝石预制体,创建脚本StarGem,内容如下:

public class StarGem : MonoBehaviour
{
//进入触发器
private void OnTriggerEnter(Collider other)
{
//检测进入触发器的对象是否是玩家
if (other.TryGetComponent<PlayerController>(out PlayerController player))
{//打开空中跳跃能力
player.CanAirJump = true;
//Destroy(gameObject);不可直接摧毁宝石
}
}
}

碰撞体配置,记得打开触发器

image-20220907181056931

接下来实现星星宝石消失后延时恢复

public class StarGem : MonoBehaviour
{//进入触发器

[SerializeField] float resetTime = 2;
MeshRenderer meshRenderer;//渲染器组件
new Collider collider;//碰撞器组件

WaitForSeconds waitResetTime;
private void Awake()
{
meshRenderer = GetComponentInChildren<MeshRenderer>();
collider = GetComponent<Collider>();
waitResetTime = new WaitForSeconds(resetTime);
}
private void OnTriggerEnter(Collider other)
{
//检测进入触发器的对象是否是玩家
if (other.TryGetComponent<PlayerController>(out PlayerController player))
{//打开空中跳跃能力
player.CanAirJump = true;
//Destroy(gameObject);不可直接摧毁宝石
meshRenderer.enabled = false;//关闭宝石的渲染器组件
collider.enabled = false;//关闭碰撞器组件
//Invoke(nameof(Reset), resetTime);//延时resetTime秒调用函数
StartCoroutine(ResetCoroutine());//启动延时携程
}
}
IEnumerator ResetCoroutine()
{//延时携程
yield return waitResetTime;//挂起等待resetTime秒
Reset();//实现功能
}
void Reset()
{
meshRenderer.enabled = true;//关闭宝石的渲染器组件
collider.enabled = true;//关闭碰撞器组件
}
}

给星星添加音效

组件中添加Audio Source,在代码中添加拾取音效.图中已圈出

image-20220908024359260

旋转星星

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AutoRotate : MonoBehaviour
{
[SerializeField] Vector3 rotation;
private void Update()
{//旋转
transform.Rotate(rotation * Time.deltaTime);
}
}

image-20220908233011726

评论