入门
1.Awake()与Start()
两者都会在加载脚本时自动运行
Awake();
在脚本使用前就会被调用,一般处理脚本间的引用和初始化
Start();
一旦脚本组件enabled,就会调用,紧接着会调用Update()
2.Update()与FixedUpdate()
Update();
>每一帧都调用
>用于常规更新:移动非物理对象、简单的计时器、获得输入
>调用的间隔时间当然依赖不同帧的时长
FixedUpdate();
>每一次物理步骤调用
>FixedUpdate 间隔是持续不变的
>用于常规更新如物理刚体对象的调整
3.component.enable = false与gameObject.SetActive(fasle)
4.transform.Translate()与transform.Rotate()
例如:transform.Rotate(Vector3.up, -turnSpeed*Time.deltaTime)
乘以deltaTime是为了控制速度不要太快,每秒执行而不是每帧。注意此方法不能用于碰撞体。
5.transform.LookAt(target)
其中target也是transform
6.Lerp()
newPosition = transform.position;
transform.position = Vector3.Lerp(transform.position, newPosition, Time.deltaTime*smooth);
newIntensity = light.Intensity或者light.color
light.intensity = Mathf.Lerp(light.intensity, newIntensity, Time.detaTime*smooth);
7.Destroy()
Destroy(gameObject, 3f); Destroy(component, 3f);
8.GetButtonDown, GetButton, GetButtonUp;GetKeyDown, GetKey, GetKeyUp
9.GetComponent非常耗费性能,所以一般放在Awake()里
10.值类型Vector3 pos/ 引用类型Transform tran = transform的区别。
11.初始化一个刚体
Rigidbody roketInstance;
rocketInstance = Instantitate(roketPrefab, barrelEnd.position, barreleEnd.rotation) as Rigidbody;
12.数组
public GameObject[] player;
player = GetObject.FindGameObjectWithTag("Player");
13.调用函数
InvokeRepeating("SpawnObject", delayTime, RepeatTime);
CancelInvoke("SpawnObject");
14.枚举类型
如果其他类要用到该类型,就要把定义放在类外
enum Direction{North = 10, East, South, West}
中级
1.属性 Properties
public int Experience
{
get
{
//Some other code
return experience;
}
set
{
experience = value;
}
}
属性主要区别于公有变量的两点:一是可以省略get或set之一实现只读或只写,二是get和set可以像函数一样放入其他代码。
以经验值、等级为例。
2.三元运算符 Ternary Operator
替代简单的if-else语句。
3.静态 Statics
静态变量与静态方法属于类,而不属于某个对象。可以不实例化对象来使用静态成员。
以敌人数量为例。
4.重载 Overloading
系统决定运行哪个重载方法要做的三件事情:1.Exact Match 2.Least Conversion 3.Error
5.泛型 Generics
可以将类型作为参数传递,允许在不知道使用数据的确切类型时进行编程。
public T GenericMethod<T>(T param) where T :
class /struct 引用类型/值类型
new() 没有参数的公共构造函数
MonoBehaviour 指的是T是这种类,或者是其派生类
IEnumerable T实现了该接口
6.继承 Inheritance
7.多态性 Ploymorphism
8.成员隐藏 Member Hiding
在子类中重新创建父类的成员,一定要在声明前加new
9.重写 Overriding
virtual+override 子类既可以添加功能,又不丢失父类提供的功能。
10.接口 Interfaces
一个类不能继承多个类,但是可以实现多个接口。
public class Avatar : MonoBehaviour, IKillable, IDamagable<float>{}
11.扩展方法 Extension Methods
向类型添加功能的一种方法,而无需创建派生类型或更改原始类型。必须放在非泛型静态类中。
下面以Transform为例
using UnityEngine;
using System.Collections;
public static class ExtensionMethods
{
//第一个参数前面必须加this,后面的可以不加
public static void ResetTransfomation(this Transform trans)
{
trans.position = Vector3.zero;
trans.localRotation = Quaternion.identity;
trans.localScale = new Vector3(1, 1, 1);
}
}
12.命名空间 Namespaces
三种方法使用命名空间。嵌套命名空间。
13.列表和字典 Lists and Dictionaries
首先要using System.Collection.Generic;
List<BadGuy> badguys = new List<BadGuy>();
创建以及一些重要操作:Add、 Count、 RemoveAt、 Insert
如果实现排序,就要在列表类型定义,前using System,实现IComparable接口,声明public int CompareTo(){}。
Dictionary<string, BadGuy> badguys = new Dictionary<string, BadGuy>();
如果不确定key值是否存在,使用如下类似方法badguys.TryGetValue("birds", out temp)
14.协程 Coroutines
可以看作一个间隔执行的函数
15.四元数 Quaternions
处理旋转的最好方法,永远不要单独改变四元素的一部分
16.委托 Delegates
可以简单的看作函数的容器
delegate void MultiDelegate();
MultiDelegate myMultiDelegate;
...
myMultiDelegate += PowerUp;
myMultiDelegate += TurnRed;
if(myMultiDelegate != null){
myMultiDelegate();
}
17.特性 Attributes
18.事件 Events