您的位置:首页 > 移动开发 > Unity3D

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

2016-01-20 10:38 1301 查看
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 菜单
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息