• 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();
       }
     }
  • 相关阅读:
    设计模式之责任链模式(Chain of Responsibility )
    Cubieboard2裸机开发之(二)板载LED交替闪烁
    Cubieboard2裸机开发之(一)点亮板载LED
    A20(Cubieboard2)启动过程浅析
    入手Cubieboard2之制作最小Linux系统
    ARM Linux启动代码分析
    Linux设备驱动剖析之Input(四)
    Linux设备驱动剖析之Input(三)
    Linux设备驱动剖析之Input(二)
    Linux设备驱动剖析之Input(一)
  • 原文地址:https://www.cnblogs.com/plateFace/p/7810401.html
Copyright © 2020-2023  润新知