提示:以下是本篇文章正文内容
范型单例
说明:看不懂范型可以跳到官方范型教学
或者跳到我的C#基础到入门篇里面的范型说明
1、创建
public class Singleson<T> : MonoBehaviour where T :
{
private static T instance;
public static T Instance { get => instance; }
//父类的一个虚方法
protected virtual void Awake()
{
if (instance != null)
Destroy(gameObject);
else
instance = (T)this;
}
//判断是不是空/清楚
protected virtual void OnDestroy()
{
if (instance == this)
{
instance = null;
}
}
//判断单例是否为空
public static bool IsInitialized
{
get { return instance != null; }
}
}
2、使用
public class GameManager : Singleson<GameManager>
{
public int playerStats;
public void RigisterPlayer(int player)
{
playerStats = player;
}
3. 总结
就不用一个一个去创建Instance单例了
想要使用单例就继承Singleson<T>单例类
}
接口的使用
看不懂接口可以跳到官方单例教学
1、创建
public interface IEndGameObsever
{
public void EndObserve();
}
2、使用
public List<IEndGameObsever> endGameObsevers = new List<IEndGameObsever>();
public void AddObserve(IEndGameObsever observer)
{
endGameObsevers.Add(observer);
}
public void RemoveObserve(IEndGameObsever observer)
{
endGameObsevers.Remove(observer);
}
public void NotifyObserver()
{
foreach (var item in endGameObsevers)
{
item.EndObserve();
}
}
3、作用
在特定状态 如死亡就可以调用NotifyObserver通知使用该接口的做一些事情如胜利播放胜利动画等
public void EndObserve()
{
/// < summary >
/// 结束是执行的接口i
/// </ summary >
isWalk = false;
isChase = false;
//执行胜利的动画等等
animator.SetBool("isVictory", true);
attackTarget = null;
isPlayerObserve = true;
}
常用好用的方法
还有跟多好玩方法→→→:可以跳到官方教学
使用代码:
创建一个静态类
public static class ExtensionMethod
{
private const float distance = 0.5f;
public static bool isFacingTarger(this Transform transform, Transform targer)
{
Vector3 diretion = targer.transform.position - transform.position;
diretion.Normalize();
这个方法返是判断攻击的正前方左右0.5有没有敌人,如果在他攻击扣血点还没触发跑到敌人后面就不会受到攻击
var dot = Vector3.Dot(transform.forward, diretion);
return dot > distance;
}
}
说明:可以在敌人砍下的时候跑到敌人后面,这时候就不会受到攻击!
事件委托的脚本
管理事件的脚本📃📃📃
using System;
//简便的事件中心 把所有的数据通过订阅的方式传递到个个代码中
public class EventHandler
{
更新UI事件
//订阅
public static event Action<int, int> UpdateUIEvent;
//呼叫
public static void CallUpdateEvent(int index,int index1)
{
UpdateUIEvent?.Invoke(index, index1);
}
}
使用事件 订阅与注册📃📃📃
订阅事件:
绑定:EventHandler.UpdateUIEvent += OnUpdateUIEvent;
解绑:EventHandler.UpdateUIEvent -= OnUpdateUIEvent;
注册事件:EventHandler.CallUpdateEvent(100,512);
#使用字典、栈、哈希值案例
🐧🐧🐧//字典小仓库 判断游戏是否完成
private Dictionary<string, bool> MiniGameDic = new Dictionary<string, bool>();
private void OnAfterSceneLoadedEvent()//事件切换场景会执行
{
foreach (var item in FindObjectsOfType<MiniGame>())
{
//判断有没有这个名字有就更新判断
if (MiniGameDic.TryGetValue(item.gameName,out bool isPass))
{
item.isPass = isPass;
item.UpdateMiniGameStart();
}
}
}
🐧🐧🐧//栈可以用于对话
🐧🐧🐧//哈希可以用于有一个空位的小游戏,可以记录空位判断其他东西可不可以往那个位子移动