1. 程式人生 > >Unity3d 不使用GameObject.SetActive,而是將GameObject移除到螢幕外

Unity3d 不使用GameObject.SetActive,而是將GameObject移除到螢幕外

原創,轉載請註明出處。

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