您好,登錄后才能下訂單哦!
這篇文章主要介紹了Unity如何給物體添加多個Tag,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在unity中,我們經常通過給物體添加標簽來判斷這個物體是不是我們想要的
但是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
新建一個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
分別為tag1
,tag2
和tag1
TagManager
只有tag1
運行
但是這樣當退出Play模式后,List中的數據會被清空,所以可以使用ScriptableObject
進行持久化存儲也可以使用Odin等插件直接對字典進行序列化
新建一個TagsAsset.cs
[CreateAssetMenu] public class TagsAsset : ScriptableObject{ public List<string> tags=new List<string>(); }
將原先代碼中tagsList
相關的代碼修改為tagsAsset.tags
并修繕一下即可
導入Odin插件,使TagManager
繼承自SerializedMonoBehaviour
[NonSerialized, OdinSerialize] public Dictionary<string, List<GameObject>> tagsDictionary = new Dictionary<string, List<GameObject>>();
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Unity如何給物體添加多個Tag”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。