Unity3d 不使用GameObject.SetActive,而是將GameObject移除到螢幕外
阿新 • • 發佈:2019-01-31
原創,轉載請註明出處。
劉帥 2017年7月27日 第一次編寫。
我簡單嘗試了一下編寫了兩個擴充套件函式,將指定GameObject移除螢幕外,使用方法與GameObject.SetActive(bool value)相同。
寫了改變本地座標和世界座標兩種方法,簡單測試下來可行,兩種方法效果相同:
public static class UnityExtension { public static readonly Dictionary<int, Vector3> DicActiveLocalPosition = new Dictionary<int, Vector3>(); public static void SetNewActiveLocal(this GameObject go, bool value) { if (!go) { return; } if (!value && go.transform.localPosition == Vector3.one * 100000) { return; } int id = go.GetInstanceID(); if (go.transform.localPosition != Vector3.one * 100000) { DicActiveLocalPosition[id] = go.transform.localPosition; } Vector3 originLocalPosition = Vector3.zero; DicActiveLocalPosition.TryGetValue(id, out originLocalPosition); go.transform.localPosition = value ? originLocalPosition : Vector3.one * 100000; } public static readonly Dictionary<int, Vector3> DicActiveWorldPosition = new Dictionary<int, Vector3>(); public static void SetNewActiveWorld(this GameObject go, bool value) { if (!go) { return; } if (!value && go.transform.position == Vector3.one * 100000) { return; } int id = go.GetInstanceID(); if (go.transform.position != Vector3.one * 100000) { DicActiveWorldPosition[id] = go.transform.position; } Vector3 originWorldPosition = Vector3.zero; DicActiveWorldPosition.TryGetValue(id, out originWorldPosition); go.transform.position = value ? originWorldPosition : Vector3.one * 100000; } }