中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity如何給物體添加多個Tag

發布時間:2021-04-26 10:17:41 來源:億速云 閱讀:534 作者:小新 欄目:開發技術

這篇文章主要介紹了Unity如何給物體添加多個Tag,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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

Unity如何給物體添加多個Tag

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

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

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

然后創建一個單例類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中的值后,播放時會自動清除數據,所以還要給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

Unity如何給物體添加多個Tag

新建一個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]+"標簽");
			}
		}
	}
}

這樣像下面這樣直接調用即可

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;
}

測試一下

創建兩個掛有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

Unity如何給物體添加多個Tag

運行

Unity如何給物體添加多個Tag

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

使用ScriptableObject

新建一個TagsAsset.cs

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

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

使用Odin

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Unity如何給物體添加多個Tag”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泌阳县| 建平县| 吉水县| 上杭县| 格尔木市| 翁源县| 喀喇| 密山市| 元谋县| 灌南县| 鲁甸县| 台中县| 乌兰县| 苏尼特右旗| 中方县| 兰坪| 柏乡县| 安庆市| 揭西县| 神农架林区| 阜康市| 营山县| 苍梧县| 龙游县| 迁安市| 海原县| 波密县| 托里县| 泰安市| 微博| 宜宾县| 乡宁县| 大荔县| 伊川县| 宜兰县| 长葛市| 乌苏市| 邳州市| 来宾市| 蒙自县| 朔州市|