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

常规方法:通过委托联系宝石与门(观察者模式)

流程是:

  • 在宝石脚本中创建委托,并在碰撞函数中调用(Invoke());
  • 在门脚本中创建函数(Open())摧毁对象,并且订阅宝石中的委托。
  • 当宝石碰撞,调用了委托,订阅委托的两个门就执行相应动作(摧毁)。

image-20220921125104646

说明:红宝石和蓝宝石是一次性的,所以拾取后要摧毁音效对象,而黄宝石是需要重复利用的,不需要摧毁。

为了整体音效更好管理,新建一个SoundEffectsPlayer类,附加在SFX Player对象上,SFX Player对象上要有AudioSource组件

image-20220919133724914

public class SoundEffectsPlayer : MonoBehaviour
{
public static AudioSource audioSource { get; private set; }
private void Awake()
{
audioSource = GetComponent<AudioSource>();
audioSource.playOnAwake = false;
}
}

private void OnGUI() { Rect rect = new Rect(200, 200, 200, 200);//显示位置 string msg = "是否有跳跃缓冲:" + HasJumpInputBuffer;//字符串 GUIStyle style = new GUIStyle();//自定义文本样式 style.font...

功能实现

说明:未落地时按跳跃键,可被记录,并且落地后起跳。

  • 降落状态,并且无法二段跳时,开启缓冲输入
  • 从降落到落地之间只要一直按着空格,落地后会立马跳起。
  • 中间松开就会关闭缓冲输入
  • 落地关闭缓冲输入

PlayerInput中添加变量public bool HasJumpInputBuffer { get; set; }

土狼时间

人物在地面/平台边缘即将掉落的时候,仍有机会进行跳跃动作;

其原理是:在人物掉落判定时开始计时,在设置的土狼时间内,可以按键跳跃。

  • 新建一个状态脚本PlayerState_CoyoteTime,大部分代码可复制PlayerState_Run
  • RUN状态转向CoyoteTime,首先关闭刚体重力(需要在PlayerController脚本中添加方法获取参数),使角色在空中保持一段时间。状态结束再开启刚体重力。
  • 其中包含的下落状态处理逻辑,因此可以将PlayerState_Run中浮空切换下落状态改为切换为PlayerState_CoyoteTime

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

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

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

实现空中多段跳

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

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

Cinemachine Camera

转载自知乎用户:Ouroboros

文章地址:https://zhuanlan.zhihu.com/p/516625841

本篇节选了body部分

仅做记录

vscode需要的插件如下:

  • Auto-Using for C#,自动添加引用
  • Unity Code Snippets,unity代码补全
  • c#,必备
  • C# XML Documentation Comments,三下///实现xm注释l
  • Code Runner,运行代码
  • GitHub Theme;eppz! (C# theme for Unity);Gruvbox Theme;(三款编辑器皮肤

期间会提示安装.net framework,sdk包。

教程来自b站阿严:https://www.bilibili.com/video/BV1rL4y1W7KH


成果展示:

【[unity]平台跳跃类demo】 https://www.bilibili.com/video/BV1AK411Q7ry?share_source=copy_web&vd_source=644eac695af0d52dcffdec474d1423b1

Invoke方法是Unity3D 中的一种委托机制。

现在看一下官网给出的API:

public void Invoke(string methodName, float time);

methodName 是方法名,time 是具体几秒

Invokes the method methodName in time seconds.

在具体事件以后调用这个方法