最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity給物體添加多個Tag的實現(xiàn)

 更新時間:2021年04月26日 09:36:04   作者:legroft  
這篇文章主要介紹了Unity給物體添加多個Tag的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在unity中,我們經(jīng)常通過給物體添加標簽來判斷這個物體是不是我們想要的

但是unity默認只能添加一個標簽,那如果我們要給一個物體添加多個標簽應該怎么辦

首先,我們定義一個Tag.cs類,這個類用來存儲物體的tag信息

public class Tags : MonoBehaviour{
    public List<string> tags=new List<string>();
}

然后創(chuàng)建一個單例類TagManager.cs用來管理tag

public class TagManager : MonoBehaviour {
   public static TagManager Instance { get; private set; }
   private void Awake() {
      if (Instance == null) {
         Instance = (TagManager) this;
         DontDestroyOnLoad(gameObject);
      }
      else {
         Destroy(gameObject);
      }
   }
}

TagManager中增加存儲tag的list和對應物體的dictionary

public List<string> tagsList = new List<string>();
[ShowInInspector]
public Dictionary<string, List<GameObject>> tagsDictionary = new Dictionary<string, List<GameObject>>();

但是inspector窗口中修改dictionary中的值后,播放時會自動清除數(shù)據(jù),所以還要給dictionary賦值

private void InitTags() {
   int length = tagsList.Count;
   tagsDictionary = new Dictionary<string, List<GameObject>>(length);
   for (int i = 0; i < length; i++) {
      tagsDictionary.Add(tagsList[i], new List<GameObject>());
   }
}

然后我們通過在inspector窗口修改list來修改物體的taf

新建一個Extensions.cs,我們在這個類里面寫一些擴展方法

public static class Extensions {
   //包含所有的 tag 返回true
   public static bool HasTag(this GameObject gameObject, params string[] tag) {
      if (gameObject.TryGetComponent<Tags>(out Tags t)) {
         for (int i = 0; i < tag.Length; i++) {
            if (!t.tags.Contains(tag[i])) {
               Debug.Log(gameObject.name+"不存在"+tag+"標簽");
               return false;
            }
         }
      }
      return true;
   }
   //給物體增加 tag
   public static void AddTag(this GameObject gameObject, params string[] tags) {
      if (gameObject.TryGetComponent<Tags>(out Tags t)) {
         foreach (var tag in tags) {
            if (!TagManager.Instance.tagsList.Contains(tag)) {
               Debug.Log("增加一個tag:" + tag);
               TagManager.Instance.tagsDictionary.Add(tag, new List<GameObject>());
               Debug.Log(tag + "增加一個物體" + gameObject.name);
               TagManager.Instance.tagsDictionary[tag].Add(gameObject);
            }
            else {
               Debug.Log(tag + "增加一個物體" + gameObject.name);
               TagManager.Instance.tagsDictionary[tag].Add(gameObject);
            }
         }
      }
   }
   //給物體刪除tag
	public static void RemoveTag(this GameObject gameObject,params string[] tags) {
		for (int i = 0; i < tags.Length; i++) {
			if (gameObject.HasTag(tags[i])) {
				gameObject.GetComponent<Tags>().tags.Remove(tags[i]);
				Debug.Log(gameObject.name+"移除"+tags+"標簽");
				TagManager.Instance.tagsDictionary[tags[i]].Remove(gameObject);
			}
			else {
				Debug.LogWarning(gameObject.name+"不存在"+tags[i]+"標簽");
			}
		}
	}
}

這樣像下面這樣直接調(diào)用即可

gameObject.AddTag("Player","Tag1");
gameObject.HasTag("Player","Tag1");
gameObject.RemoveTag("Player");

最后TagManager.cs中通過標簽獲取所有物體

public List<GameObject> FindObjsWithTag(string tag) {
    if (tagsDictionary.ContainsKey(tag)) {
        return tagsDictionary[tag];
    }
    Debug.Log("不存在標簽為" + tag + "的物體");
    return null;
}

測試一下

創(chuàng)建兩個掛有Tags.cs腳本的物體

public class Tags : MonoBehaviour{
    public List<string> tags=new List<string>();
    void Start() {
        gameObject.AddTag(tags.ToArray());
        gameObject.HasTag("Player");
    }
    void Update(){
        if (Input.GetKeyDown(KeyCode.A)) {
            gameObject.RemoveTag("Player","tag1");
        }
    }
}

兩個物體具有的tag分別為tag1tag2tag1

TagManager只有tag1

運行

但是這樣當退出Play模式后,List中的數(shù)據(jù)會被清空,所以可以使用ScriptableObject進行持久化存儲也可以使用Odin等插件直接對字典進行序列化

使用ScriptableObject

新建一個TagsAsset.cs

[CreateAssetMenu]
public class TagsAsset : ScriptableObject{
    public List<string> tags=new List<string>();
}

將原先代碼中tagsList相關(guān)的代碼修改為tagsAsset.tags并修繕一下即可

使用Odin

導入Odin插件,使TagManager繼承自SerializedMonoBehaviour

[NonSerialized, OdinSerialize]
public Dictionary<string, List<GameObject>> tagsDictionary = new Dictionary<string, List<GameObject>>();

關(guān)于Odin的進階可以看https://zhuanlan.zhihu.com/p/268324619

到此這篇關(guān)于Unity給物體添加多個Tag的實現(xiàn)的文章就介紹到這了,更多相關(guān)Unity 物體添加多個Tag內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實現(xiàn)數(shù)據(jù)去重的方式總結(jié)

    C#實現(xiàn)數(shù)據(jù)去重的方式總結(jié)

    這篇文章主要來和大家一起來討論一下關(guān)于C#數(shù)據(jù)去重的常見的幾種方式,每種方法都有其特點和適用場景,感興趣的小伙伴可以了解一下
    2023-07-07
  • C#中如何限制TextBox控件內(nèi)輸入值的范圍

    C#中如何限制TextBox控件內(nèi)輸入值的范圍

    這篇文章主要介紹了C#中如何限制TextBox控件內(nèi)輸入值的范圍,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#?form-data上傳圖片流到遠程服務器的詳細代碼

    C#?form-data上傳圖片流到遠程服務器的詳細代碼

    這篇文章主要介紹了C#?form-data上傳圖片流到遠程服務器的詳細代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C#9新特性init only setter的使用

    C#9新特性init only setter的使用

    這篇文章主要介紹了C#9新特性init only setter的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Unity 如何獲取鼠標停留位置下的物體

    Unity 如何獲取鼠標停留位置下的物體

    這篇文章主要介紹了Unity 如何獲取鼠標停留位置下的物體,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#過濾sql特殊字符串的方法

    C#過濾sql特殊字符串的方法

    這篇文章介紹了C#過濾sql特殊字符串的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#中RSA加密與解密的實例詳解

    C#中RSA加密與解密的實例詳解

    這篇文章主要介紹了C#中RSA加密與解密的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • C#位移的介紹與例子

    C#位移的介紹與例子

    很多人提問,不知道C#位移,可能有些人在面試中也遇到過
    2013-04-04
  • C#中怎樣從指定字符串中查找并替換字符串?

    C#中怎樣從指定字符串中查找并替換字符串?

    本篇文章,小編為大家介紹一下,C#中怎樣從指定字符串中查找并替換字符串?有需要的朋友可以參考一下
    2013-04-04
  • DevExpress的DateEdit設置顯示日期和時間的方法

    DevExpress的DateEdit設置顯示日期和時間的方法

    本文主要介紹了DevExpress的DateEdit設置顯示日期和時間的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08

最新評論

绵阳市| 开平市| 平邑县| 罗甸县| 济源市| 静乐县| 孝感市| 丁青县| 禹城市| 英德市| 景泰县| 微山县| 唐海县| 平邑县| 普安县| 桃园市| 麻江县| 宣威市| 博乐市| 镇平县| 五河县| 明水县| 门头沟区| 门源| 承德县| 米林县| 鄄城县| 汪清县| 南雄市| 潢川县| 乡城县| 澜沧| 綦江县| 遵化市| 鄄城县| 宜兰县| 璧山县| 墨竹工卡县| 陇西县| 将乐县| 商水县|