Csharp
未读C#中? 、?? 、?. 、??= 的用法和说明(转载)一、可空类型修饰符< ? >引用类型能用空引用来表示一个表示一个不存在的值,但是值类型不能。例如:
string str = null;int i = null;//编译报错
为了使值类型也能使用可空类型,就可以用 “ ? “来表示,表现形式为”T?”。例如:
int i? //表示可空的整型DateTime time? //表示可空的时间
二、空合并运算符< ?? >用于定义引用类型和可空类型的默认值。如果此运算符的左操作数不为Null,则此操作符将返回左操作数,否则返回右操作数。
var c = a??b //当a不为null时返回a,为null时返回b
三、< ?. >不为null时执行后面的操作。例如:
Person.Name?.Person.Code Person.Name = Person == null ? null : Person.Code //两段代码等效
四、< ??= >C# 8.0 引入了 null 合并赋值运算符 ??= ...
unity
未读ready动画结束后游戏开始,开始计时,直到死亡或者胜利再暂停计时。
新建ClearTime脚本用来更新时间文本,开始动画过后再计时
public class ClearTime : MonoBehaviour{ [SerializeField] Text timeText; [SerializeField] VoidEventChannel levelStartedEventChannel;//开始游戏 [SerializeField] VoidEventChannel levelClearedEventChannel;//玩家过关 [SerializeField] StringEventChannel cleardTimeTextEventChannel;//带string参数的频道 [SerializeField] VoidEventChannel playerDefeatedEventChannel;//玩家失败 float clearTime;//时间 bool stop = true;//计时停止 private void OnEnable() ...
unity
未读说明:为角色胜利镜头做特殊定制
follow属性用玩家对象
Animated Target:动画目标属性,拖入角色.
原有的相机拖入状态驱动虚拟相机下
复制一个相机改名为Zoom In,意为镜头放大的虚拟相机.
将镜头垂直视野值36改为24
回到状态驱动虚拟相机对象,在这可选玩家不同状态对应使用不同的相机,还可以设置延迟1.2秒切换
unity
未读过关功能实现说明:过关时开启ui,切换状态为vitory,落地后再播放动画。
VictoryScreen中增加代码:订阅按钮功能,唤出鼠标指针。
using UnityEngine;using UnityEngine.UI;public class VictoryScreen : MonoBehaviour{ [SerializeField] VoidEventChannel levelClearedEventChannel;//获取事件频道 [SerializeField] Button nextLevelButton; private void OnEnable() { levelClearedEventChannel.AddListener(ShowUI); nextLevelButton.onClick.AddListener(SceneLoader.LoadNextScene);//订阅下一关按钮功能 } private void OnDisable() { levelClearedEventChanne ...
unity
未读说明:玩家碰到尖刺或者被黑球撞到就会死亡
功能实现尖刺碰撞首先选中所有尖刺,为他们添加脚本Spike
using UnityEngine;public class Spike : MonoBehaviour{ private void OnTriggerEnter(Collider other) { if (other.TryGetComponent(out PlayerController player)) {//如果碰撞的是挂载PlayerController的对象 player.OnDefeated();//游戏失败,玩家身上相关功能禁用 } }}
角色属性调整(关闭功能)通过问题修复功能,自动在PlayerController脚本中生成**OnDefeated()**函数;
同样地,在input类中生成DisableGamePlayInputs();
public void OnDefeated() {//游戏失败 input.DisableGamePlayInp ...
unity
未读说明:开始游戏时播放ui动画,放完后摧毁红色闸门。游戏结束时(吃完红宝石),弹出用时、结束画面。
开始画面开始时ReadyScreen对象的Canvas和Animator组件默认为开启。
在ReadyScreen对象下新建同名脚本ReadyScreen,拖入脚本化对象VoidEventChannel:
ui关闭时调用委托(关门),并且隐藏Canvas和Animator,播放音效。
public class ReadyScreen : MonoBehaviour{ [SerializeField] VoidEventChannel levelStartedEventChannel;//获取事件频道 [SerializeField] AudioClip beginSFX;//开始音效 private void CloseUI() { levelStartedEventChannel.Broadcast();//调用委托 GetComponent<Canvas>().enabled = false; GetComponent& ...
常规方法:通过委托联系宝石与门(观察者模式)流程是:
在宝石脚本中创建委托,并在碰撞函数中调用(Invoke());
在门脚本中创建函数(Open())摧毁对象,并且订阅宝石中的委托。
当宝石碰撞,调用了委托,订阅委托的两个门就执行相应动作(摧毁)。
这个方法缺点是门与宝石耦合
给宝石添加委托event关键字:其他类不可使用=,只可以+=或-=
碰撞事件函数中调用委托
给门添加Gate脚本写一个函数来销毁门
void Open() { Destroy(gameObject); }
获取gateTrigger实例并且
在**Onenable()**中订阅Open函数
引入Scriptable Object实现解耦
新建一个EventChannels文件夹并且创建VoidEventChannel脚本
将它继承于ScriptableObject,实现声明委托、调用、订阅、退订等操作。
using UnityEngine;[CreateAssetMenu(menuName = "Data/EventChanne ...
unity
未读说明:红宝石和蓝宝石是一次性的,所以拾取后要摧毁音效对象,而黄宝石是需要重复利用的,不需要摧毁。
为了整体音效更好管理,新建一个SoundEffectsPlayer类,附加在SFX Player对象上,SFX Player对象上要有AudioSource组件。
public class SoundEffectsPlayer : MonoBehaviour{ public static AudioSource audioSource { get; private set; } private void Awake() { audioSource = GetComponent<AudioSource>(); audioSource.playOnAwake = false; }}
StarGem,黄色跳跃星星脚本中,注释掉AudioSource定义代码,播放音效改为调用SoundEffectsPlayer类中的AudioSource:SoundEffectsPlayer.audioSource.P ...
unity
未读private void OnGUI() { Rect rect = new Rect(200, 200, 200, 200);//显示位置 string msg = "是否有跳跃缓冲:" + HasJumpInputBuffer;//字符串 GUIStyle style = new GUIStyle();//自定义文本样式 style.fontSize = 20; style.fontStyle = FontStyle.Bold;//粗体 GUI.Label(rect, msg, style); }
unity
未读功能实现说明:未落地时按跳跃键,可被记录,并且落地后起跳。
降落状态,并且无法二段跳时,开启缓冲输入。
从降落到落地之间只要一直按着空格,落地后会立马跳起。
中间松开就会关闭缓冲输入。
落地后关闭缓冲输入。
PlayerInput中添加变量public bool HasJumpInputBuffer { get; set; }
**onEnable()**函数中添加松开按键判定
private void OnEnable() { //当玩家松开按键跳跃时 playerInputAction.GamePlay.Jump.canceled += delegate { HasJumpInputBuffer = false;//松开按键关闭跳跃输入缓冲 }; }
PlayerState_Fall脚本中添加输入缓冲
if (input.playerjump) { if (player.CanAirJump) {//当玩家可以跳跃时(吃到星星,测试时 ...