Unity 開發游戲編寫代碼的技巧


在平時開發游戲過程中,遇到一些編寫代碼很繁瑣的問題. 我發現我團隊中每個人都會遇到,就算打寫出來分享下經驗.

 

條件斷點

利用IDE提供的工具, 右鍵斷點的時候 輸入條件, 當條件達成的時候,斷點才能命中. (以前不知道這個功能總是要關閉游戲->編寫代碼-> 重新運行游戲 –> 查看結果 這個流程非常麻煩)

class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                if (i == 50)      //利用條件斷點,不寫代碼情況下 斷點到某一個條件
                   {
                    Console.WriteLine("我斷點到了");
                }
            }
            Console.ReadKey();
        }
    }

image

 

運行表達式

你在想在某一個時段運行xxx代碼, 可以通過以下方式. 選擇某一個變量右鍵-> 快速監視

image

image

 

利用反射更好的編寫測試代碼

在我編寫代碼的時候,需要編寫一些測試工具方便調試游戲,  但是在編寫一些測試代碼的時候,  總是為了方便,快速不小心破壞了代碼的原有結構, 比如一個字段private 為了快速的訪問到 就改成public.  我寫了階段簡單實用的代碼

public static class RefStatic
{

    public static FieldInfo RefFieldVal(this object t, string name)
    {
        FieldInfo info = t.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic);
        return info;
    }

    public static FieldInfo RefStaticFieldVal(this object t, string name)
    {
        FieldInfo info = t.GetType().GetField(name, BindingFlags.Static | BindingFlags.NonPublic);
        return info;
    }

    public static FieldInfo RefSetFieldVal(this object t, string name, object val)
    {
        FieldInfo info = t.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic);
        if (info != null)
            info.SetValue(t, val);

        return info;
    }

    public static FieldInfo RefSetStaticFieldVal(this object t, string name, object val)
    {
        FieldInfo info = t.GetType().GetField(name, BindingFlags.Static | BindingFlags.NonPublic);
        if (info != null)
            info.SetValue(t, val);

        return info;
    }


    public static PropertyInfo RefSetPropertyVal(this object t, string name, object val)
    {
        PropertyInfo info = t.GetType().GetProperty(name);
        if (info != null)
            info.SetValue(t, val, null);

        return info;
    }

    public static MethodInfo RefExecuteMethod(this object t, string name, object[] parameters)
    {
        MethodInfo info = t.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance);
        if (info != null)
            info.Invoke(t, parameters);

        return info;
    }
}

使用的栗子:

if (GUILayout.Button("生成全部單元格"))
{
   var bag = (Panel_CommonBag)target;
   GameObject[] go = (GameObject[])bag.RefFieldVal("m_CellList").GetValue(bag);
   for (int i = 0; i < go.Length; i++)
   {
      KnapsackColumn k = go[i].GetComponent<KnapsackColumn>();
      k.CreateCell();
   }
 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM