zl程序教程

您现在的位置是:首页 >  后端

当前栏目

unityC#中级语法模板

c#模板 语法 Unity 中级
2023-09-11 14:19:57 时间

提示:以下是本篇文章正文内容

范型单例

说明:看不懂范型可以跳到官方范型教学
或者跳到我的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();
       }
   }
}
🐧🐧🐧//栈可以用于对话
🐧🐧🐧//哈希可以用于有一个空位的小游戏,可以记录空位判断其他东西可不可以往那个位子移动