Unity 中 C# 的基础语法 以及 常用功能

1 [HideInInspector]和 [SerializeField]
变量的序列化:再次读取Unity时序列化的变量是有值的,不需要再次去复制,因为它已经被保存下来。
[HideInInspector] 表示原本已经在面板上显示的序列化值隐藏起来
[SerializeField] 表示将原本显示在面板上的序列化的私有变量可以序列化,在下次读取时就是上次赋值的值

    1 [HideInIspector]
       public int x;
       这样可以在程序中将代码复制,但是不能在面板中看到并手动设置赋值
    2 [SerializeField]
       perivate int x;
       在面板中可以看到并且赋值
    3 如果a是私有的序列化变量,你想在面板中读取,但是不保存,那么用:-------------网上说可以,但是验证时会报错

        [HideInInspector][SerializedField]
        private int a;
        public int b{
            get{return a;}
        }

        报错??:
         error CS0246: The type or namespace name `SerializedField' could not be found. Are you missing a using directive or an assembly reference?
         error CS0246: The type or namespace name `SerializedFieldAttribute' could not be found. Are you missing a using directive or an assembly reference?

    4 如果a是私有序列化变量,你不想在面板中做任何操作(不想看到,也不想写),但是想要在程序中给它赋值,那么用。-------------网上说可以,但是验证时会报错
           [HideInInspector]
           [SerializedField]
           private int a;
           public int b{ get { return a; }  set { a = value; } }

        报错同3

2 get set 方法

    private int miX
    public int  x{ set { miX = value; } get { return miX; }}
    注意是public,也可以限定只读或者只能写入

3 传递引用 ref

    class RefExample
    {
        static void Method(ref int i)
        {
            i = 44;
        }
        static void Main()
        {
            int val = 0;------------------------ref 需要在调用方法之前赋值
            Method(ref val); // val is now 44
        }
    }

4 传递引用 out

    class OutExample
    {
        static void Method(out int i)
        {
            i = 44;
        }

        static void Main()
        {
            int value;--------------------------out 不需要在调用方法之前赋值
            Method(out value);
            // value is now 44
        }
    }

5 ref 与 out 相同点

    ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
    class Example
    {
        public void SampleMethod(out int i) { }
        public void SampleMethod(ref int i) { }
    }
    但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:
    class RefOutOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(out int i) { }
    }

6 常用的脚本API

    Trandform 游戏对象的位置、方向、缩放比例
    Time 游戏时间
    Random 随机数、随机点--球上点球内点。。。、旋转
    Mathf 数学运算

7 协同程序

    协同程序与多线程类似,但是在任一指定时刻都只会有一个协同程序在运行,别的协同程序则会挂起。
    可以起到一段程序在等待一段时间后继续执行的效果
    1 开启一个协同程序
        使用MonoBehavior.StartCoroutine可以开启一个协同程序,所以该方法需要在继承Monobehaviour的类中调用
        StartCoroutine(String methodName)
        startCoroutine(IEnumerator routine)
        a. 使用字符串作为参数可以开启线程并在线程结束之前终止线程,开启线程最多只能传递一个参数
        b. 使用IEnumeraotor开启的的线程不能随时终止(除非使用StopAllCoroutines()方法),没有参数个数的限制
    2 终止协同程序
        a. Unity使用StopCoroutine(String methodName)来终止一个协同程序,使用StopAllCoroutine来终止所有协同程序,但是这两个方法都只能终止该MonoBehaviour中的协同程序
        b. 将协同程序所在的gameObject的acitve属性设置为false,当再次设置active为true的时候,协同程序不会再开启,而设置enable和false则不会生效,因为协同程序开启后是以一个线程在运行的,它与MonoBehavior是互不干扰的模式在运行,此后除非代码调用,他们共同作用于同一个对象,只有当对象不可见的时候才能够同时终止这两个线程。

8 增加unity编辑器菜单

    [MenuItem("new Menu/new/new new/new item")]
    public static void testMenu(){
        Debug.Log("menu");
    }
    编译之后编辑器中就会出现 Menu 菜单

你可能感兴趣的:(Unity,unity,c#,脚本常用功能)