欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

但是unity默認(rèn)只能添加一個(gè)標(biāo)簽,那如果我們要給一個(gè)物體添加多個(gè)標(biāo)簽應(yīng)該怎么辦

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

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

然后創(chuàng)建一個(gè)單例類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中增加存儲(chǔ)tag的list和對應(yīng)物體的dictionary

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

但是inspector窗口中修改dictionary中的值后,播放時(shí)會(huì)自動(dòng)清除數(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

新建一個(gè)Extensions.cs,我們在這個(gè)類里面寫一些擴(kuò)展方法

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+"標(biāo)簽");
               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("增加一個(gè)tag:" + tag);
               TagManager.Instance.tagsDictionary.Add(tag, new List<GameObject>());
               Debug.Log(tag + "增加一個(gè)物體" + gameObject.name);
               TagManager.Instance.tagsDictionary[tag].Add(gameObject);
            }
            else {
               Debug.Log(tag + "增加一個(gè)物體" + 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+"標(biāo)簽");
				TagManager.Instance.tagsDictionary[tags[i]].Remove(gameObject);
			}
			else {
				Debug.LogWarning(gameObject.name+"不存在"+tags[i]+"標(biāo)簽");
			}
		}
	}
}

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

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

最后TagManager.cs中通過標(biāo)簽獲取所有物體

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

測試一下

創(chuàng)建兩個(gè)掛有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");
        }
    }
}

兩個(gè)物體具有的tag分別為tag1tag2tag1

TagManager只有tag1

運(yùn)行

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

使用ScriptableObject

新建一個(gè)TagsAsset.cs

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

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

使用Odin

導(dǎo)入Odin插件,使TagManager繼承自SerializedMonoBehaviour

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

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

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

相關(guān)文章

  • C#實(shí)現(xiàn)Dictionary字典賦值的方法

    C#實(shí)現(xiàn)Dictionary字典賦值的方法

    本文主要介紹了C#實(shí)現(xiàn)Dictionary字典賦值的方法,如同java中的Hasttable,C#里面有Dictionary,可以實(shí)現(xiàn)很高效的鍵值對操作。感興趣的可以了解一下
    2021-05-05
  • C#實(shí)現(xiàn)AI五子棋游戲的示例代碼

    C#實(shí)現(xiàn)AI五子棋游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C#如何智能AI五子棋游戲中的人工下棋操作以及對應(yīng)的機(jī)器操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • C# 設(shè)計(jì)模式系列教程-狀態(tài)模式

    C# 設(shè)計(jì)模式系列教程-狀態(tài)模式

    狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類當(dāng)中,可以把復(fù)雜的邏輯判斷簡單化。
    2016-06-06
  • c# 將Minio.exe注冊成windows服務(wù)

    c# 將Minio.exe注冊成windows服務(wù)

    這篇文章主要介紹了c# 如何將Minio.exe注冊成windows服務(wù),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用

    Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用

    這篇文章主要為大家介紹了Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C#語言中的修飾符匯總

    C#語言中的修飾符匯總

    本文主要介紹的是C#語言中的修飾符,主要從四方面介紹,希望對大家有幫助,一起來看。
    2015-10-10
  • 用C#獲取硬盤序列號,CPU序列號,網(wǎng)卡MAC地址的源碼

    用C#獲取硬盤序列號,CPU序列號,網(wǎng)卡MAC地址的源碼

    用C#獲取硬盤序列號,CPU序列號,網(wǎng)卡MAC地址的源碼...
    2007-03-03
  • C#中ref關(guān)鍵字的用法

    C#中ref關(guān)鍵字的用法

    這篇文章介紹了C#中ref關(guān)鍵字的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Visual Studio C#創(chuàng)建windows服務(wù)程序

    Visual Studio C#創(chuàng)建windows服務(wù)程序

    用Visual C#創(chuàng)建Windows服務(wù)不是一件困難的事,本文就將指導(dǎo)你一步一步創(chuàng)建一個(gè)Windows服務(wù)并使用它,本文主要介紹了Visual Studio C#創(chuàng)建windows服務(wù)程序,感興趣的可以了解一下
    2024-01-01
  • 使用C#中的Flags特性

    使用C#中的Flags特性

    這篇文章介紹了使用C#中的Flags特性,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評論