挑选了Unity引擎里一些核心API类例如 Object、GameObject、Rigidbody、Transform、Camera、Quaternion、Vector3等进行了详细的功能注解,注解内容包括API的使用方法、算法分析、边界条件、参数间的制约关系及注意事项等,特别是对很多功能相近或使用方法相似的API进行了较为详细的比较说明
函数调用顺序:
Awake:最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行顺序。
Start:不是很紧急的初始化,一般放在Start里面来做。仅在Update函数第一次被调用前调用。
Reset:用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
Update:每一帧调用一次,帧间隔时间有可能改变。
FixedUpdate:以相同时间间隔调用,用在力学更新效果中。执行在Update之前。
LateUpdate:在Update和FixedUpdate调用之后调用。一般人物的移动放在Update中,而摄像机的跟进变化放到FixedUpdate中。确保两个独立。
On开头的方法,是由其他事件触发调用的。
OnDestory:物体被删除时调用。
OnEnable:物体启用时被调用。
OnDisable:物体被禁用时调用。
OnGUI:这个函数会每帧调用好几次(每个事件一次),GUI显示函数只能在OnGUI中调用
有关函数调用顺序可以参考官方的文档:
time类
unity3D的time类在游戏中十分重要,几乎所有的游戏都要用到time类,使用场景有:技能的释放时间,限时关卡的限时,场景的加载时间等等。
方法:
timeSinceLevelLoad :加载场景完成之后所花费的时间(场景开始,开始计时)
fixedDeltaTime:每一帧所花费的时间
frameCount:一共运行了多少帧
Time.realtimeSinceStarup:从游戏开始到现在所运行的时间(当游戏暂停时和在后台运行时这个时间会一直增加
Time.fixedTime:游戏运行的时间
Time.fixeDeltaTime:游戏运行时间
Time.time:游戏运行时间
Time.smoothDeltaTime:平滑的时间变化
Time.deltaTime:每一帧的时间间隔(变化较大)
Time.timeScale:设置时间比例(可以暂停运动的物体,可以放慢动作
测试性能:(开始时记录时间,结束时记录时间)
1 | float time1 = Time.realtimeSinceStartup; |
会动的物体:
1 | cube.Translate(Vector3.forward * Time.deltaTime); //每帧向前运动1m乘以没一帧时间间隔 |
GameObject类
所有游戏物体与场景的基类
创建物体的三种方法:
一.new一个
1 | GameObject go = new GameObject("cube"); |
二.根据prefab新建(相当于克隆)(游戏物体都可以)
1 | GameObject.Instantiate(profab); |
三.创建原始的几何体
1 | GameObject.CreatePrimitive(PrimitiveType.cube); |
给一个物体添加组件
1 | GameObject.CreatePrimitive(PrimitiveType.cube); |
变量:
activeInHerarchy: 禁用父类但是不禁用子类(判断游戏物体是否激活)
activeSelf:禁用子类与父类(把一些不用的物体设置,可以节约性能;
tag: 用于区别不同物体
name:获取物体的名字
1 | Debug.Log(go.name); |
layer:可有获取游戏所在的层
scene:可以获取游戏所在的场景
public Functions:
AddComponent:为一个物体添加组件
CompareTag:比较两个物体的标签是否一样
SetActive:用于激活和禁用一个物体
BroadcastMessage:广播一个消息(所有物体都能接收)(子类也会调用)
1 | target.BroadcastMessage("Attack",null,SendMessageOptions.DontRequireReceiver);//如果有接受者则发送,如果没有不报错 |
SendMessage:发送一个消息(不会调用子类)
SendMessageUpwards: 发送消息(当前物体与父类都也会调用)
Static Functions:
CreatePrimitive:创建某个基本的几何体
Find:根据游戏名字查找(性能; 会遍历所有游戏物体,慎用)
1 | GameObject go =GameObject.Find("Main Camera"); |
FindGameObjectsWithTag:根据游戏标签查找(会查找所有的游戏物体)(效率高)
1 | GameObject[] gos =GameObject.FindGameObjectsWithTag("MainCamera");//返回的是一个数组 |
FindWithTag:根据游戏标签 查找(只会查找第一个)(查找到物体后一般要做判断,不为空的时候在进行操作)
Object类
游戏中所有对象的基类,主要用于对对象的销毁,查找
Destroy:被销毁,但是不会立刻被回收,会将要销毁的物体集中到一起,真的不用了再销毁
1 | Destroy(this);(一般是脚本)(可以销毁物体也可以销毁组件) |
DestroyImmediate:立刻将游戏物体从场景中删除(不建议用,有可能会造成空指针)
DontDestroyOnLoad:不要销毁某个物体(一般从某个场景转到下一个场景,会销毁所有的物体)会带到下一个场景,始终存在。设置共享的游戏物体
FindObjectOfType:查找某个游戏物体(根据组件类型查找游戏物体,找到第一个就返回,不管其他的)
FindObjectsOfType:会查找所有符合的组件(不查找未激活,被禁用的)
1 | Light light =FindObjectOfType<Light>(); //获取所有的灯 |
Injstantizte:实例化一个对象
MonoBehaviour
所有游戏脚本的基类,用于对游戏脚本进行操作
monoBehaviour中很多方法都与GameObject中的方法一致,在对MonoBehaviour进行操作就是对游戏物体进行操作
GetComponent:获得一个组件
1 | Cube cube = target.GetComponent<Cube>(); //类 |
GetComponents: 获得所有的相同组件
1 | Cube[] cubes = target.GetComponents<Cube>(); |
ExecuteInEditMode: 一个特性(把此方法放在类上可以使类在编辑模式下就被调用)
1 | [ExecuteInEditMoe] |
invoke: 调用某个方法(判断方法是否被调用,如果没有被调用,就会在2秒后被调用)
1 | Invoke("Attack", 3); |
InvokeRepeating :重复调用某个方法
1 | InvokeRepeating("Attack", 4, 2);//第四秒开始调用第一次,之后每2秒调用一次 |
CancleInvoke: 取消调用某个方法(取消所有的调用)
1 | CancelInvoke("Attack"); |
gameObject: 可以获取游戏脚本所在的物体
IsActiveAndEnabled:可以判断当前组件是否启用
enabel: 可以启用与禁用某个组件(禁用的updata方法)
print:输出(只能在MonoBehaviour)中使用
协程
在脚本运行过程中,需要额外的执行一些其他的代码,这个时候就可以将“其他的代码”以协程的形式来运行
相当于多开了一个线程是一个能暂停执行,暂停后立即返回,直到中断指令完成后继续执行的函数。
它类似一个子线程单独出来处理一些问题,性能开销较小。
调用函数的时候不会等函数方法运行完才继续执行
返回值是IEnmerator;
返回参数的时候使用yield return;
协程方法的调用StartCoroutine(method());
利用协程实现物体改变颜色
1 | StartCoroutine(ChangeColor()); |
利用协程实现物体颜色改变的动画效果
1 | void Update () { |
startCoroutines:开始协程
StopCoroutine: 停止指定的协程
StopAllCoroutines: 停止所有的协程
1 | public IEnumerator ie; |
Message
OnMouseDown :监听鼠标是否点击这个物体
OnMouseDrag :监听鼠标按下的过程中拖拽的时候
OnMouseEnter : 鼠标移上去的时候(跟鼠标按不按下没有关系)
OnMouseExit : 鼠标移开的时候
OnmouseOver : 鼠标在物体上的时候
OnMouseUp :鼠标点击完抬起的时候
OnMouseUpAsButton:鼠标按下与抬起实在同一个物体的时候(点击)
1 | void OnMouseDown() |
Mathf
有关于数学公式的函数
Sttic Variables:
PI:3.1415926…..
Deg2Rd:把读数变为弧度
Red2Deg:把弧度变为读数
epsilon :无限小的小数
Infinity : 无限大的数字
NegativeInfinlty : 无线大的数字
Static Functions
Abs:取绝对值
Ceil: 向上取整(负数也可以)
CeilToInt: 向上取整返回整数
Clamp :夹紧(当小于min,取min,当大于max,取max)
1 | transform.position = new Vector3(Mathf.Clamp(Time,time,1.0F,3.0),0,0) //将一物体从1移到3后停止 |
Clamp01: 把一个值限定在(0,1)之间
DeltaAngle : 算出两个角度的最短的差
Exp: e的多少次方
ClosePowerOfTwo :取得离二得次方最近的数
1 | print(Mathf.ClosestPowerOfTwo(2)); //取得离二得次方最近的数 |
floor: 向下取整
FloorToInt:向下取整返回int
Max 取得最大值
1 | print(Mathf.Max(1, 2)); |
Min: 取得最小值
1 | print(Mathf.Min(1, 2)); |
Pow(f,p) 取得p的f次方
1 | print(Mathf.Pow(4, 3)); //4的3次方 |
Sqrt : 取得参数的平方根
1 | print(Mathf.Sqrt(3)); |
Lerp: 差值运算:(可以控制角色的移动,也可以控制动画)
1 | cube.position = new Vector3(0, 0, 0); |
LerpAngle: 角度的差值运算
MoveTowarrds : 想某个方向移动
1 | float newX = Mathf.MoveTowards(x, 10, 0.02f); //匀速运动 |
PingPong: 从0到最大值来回移动(不能设置最小值)只能设置长度(当超出长度的时候就开始减小)
1 | print(Mathf.PingPong(t,30)); |
Input
有关于键盘鼠标等输入的函数与设置
GetKey: 监测按键按下(按着会一直返回ture)
1 | if(Input.GetKeyDown("left shift")) |
GetkeyDown : 监测按键按下(只有在按下时会返回ture)
GetKeyUp: 监测按键抬起
GetButton: 监测虚拟按键
GetMouseButton: 监测鼠标的按键(0,左键1,右键2,中键)(按下的过程中会一直抬起)
GetAxis: 控制运动(运动具有渐变效果)
1 | cube.Translate(Vector3.right * Time.deltaTime * Input.GetAxis("Horizontal")); |
GetAxisRaw: 运动没有渐变效果(缓冲效果)
GetTouch: 监测触摸
Static Variables
acceleration: 监测重力
gyo : 监测陀螺仪
anyKeyDown: 检测任何键的按下(会一直返回ture)(鼠标,按键)
1 | if(Input.anyKeyDown) |
mousePosition: 检测鼠标在屏幕的位置
1 | print(Input.mousePosition); |
vector2
2d模式下有关向量与位置的操作
Static Variables
down,left,right,up: 上下左右
one,zero: 坐标轴为(1,1)(0,0)的向量
Variables
magnitude: 获取向量的长度
normalized: 把向量单位化(把一个不管长度为多少的向量化为1)
sqrMagnitude:向量长度还没有被平方根的长度(节省性能)
x,y :获取x,y
1 | ptrint(Vector2.down); |
Constructors(构造方法)
vector2: 直接new一个
修改位置:向量是结构体,是值类型,要整体赋值。
transform.position = new Vector3(3,3,3); //不能直接修改
Vector3 pos = transform.position;
pos.x = 10;
transform.position = pos;
Public Functions
Equals: 判断两个向量是否相等
normalized: 把自身单位化
Set: 进行赋值
ToString:转换为String;
StaticFunction
Angle: 取得两个向量的夹角
ClampMagnitude:对向量的长度进行限定
Distance: 取向量之间的距离
Dot: 点乘
LerP: 对x,y进行两差值运算。
LerpUnclamped :差值运算不限定最大值
MoveTowards:从当前目标向目标运动
1 | Public Vector2 a = new Vector(2,2); |
Vector3
3d模式下有关向量与位置的操作
Class: 两个向量进行叉乘运算
OrthoNormalize: 让两个向量的夹角为90度
Project: 一个向量在另一个向量上的投影
Reflect: 将向量反射
Slerp: 求两个向量的差值(按照角度)
operator - * / + ==对向量的运算(判断是否相等)
Random
随机生成数,在游戏中有着广泛的应用,用于增加游戏的不确定性
Range: 返回一个随机数(不包含最大值)
1 | print(Random.Range(4,10)); |
InitState: 设置随机数生成的种子
1 | Random.InitState(0); |
ColorHSY:随机生成一个颜色
value: 生成一个0到1的小数(包括0,1)
State:获取一个种子
rotation: 随机获取一个方向(朝向)
InsideUnitCirle:在一个圆内随机生成坐标(可以用于生成敌人)(二维)
1 | cube.position = Randon.insideUnitCircle*5; |
InsideUnitsphere: 在一个圆内随机生成
Quaernion(四元数)
控制物体旋转
eulerAngles: 把四元数转换为欧拉角(常用)
1 | cube.eulerAngles = new Vetor3(45,45,45); |
Euler:把欧拉角转换为四元数
1 | cude.rotatiion = Quaternion.Euler(new Vector(45,45,45)); |
LookRotation:会使物体旋转到目标方向(望向目标)
1 | if (Input.GetKeyDown("left shift")) |
使转动更加平滑:
1 | Quaternion target = Quaternion.LookRotation(dir); |
Rigidbody
刚体组件,使物体受力的作用
freezeRotation:冻结旋转
position: 控制位置(比用transform块)
1 | playerRgd.position = playerRgd.transform.position + |
MovePositon: 持续的运动用着个(用差值的方式使运动更
加平滑)
rotation: 控制旋转(比用Transform快)
AddForce: 给物体施加力
1 | playerRgd.AddForce(Vector3.forward * force); |
MoveRotation: 控制持续的旋转
1 | playerRgd.position = playerRgd.transform.position + |
Cameera
摄像头,用于控制视角
main:直接获取mainCamera
Camer.main
通过Camer把屏幕上的点转为射线,用于检测鼠标是否移动
到物体上
ScreenPointToRay: 把屏幕坐标转换为射线
鼠标移动输出在鼠标上的物体:
1 | Ray ray = mainCamera.ScreenPointToRay |
从屏幕上射出一条射线
1 | Ray ray = mainCamera.ScreenPointToRay(new Vector3 |
Application
dataPath: 数据路径
Streaming Assets: 资源文件(创建后不会被打包)
identifier: 包的名字
isFocused: 判断是否是焦点
isMobile: 是否在移动平台
isPlaying: 编辑模式下载运行会返回ture
在编辑器模式下退出游戏
1 | UnityEditor.EditorApplication.isPlaying = false; |
Plaatform: 可以控制在某个平台下运行
identifier:标识名
companyName: 公司名
prodctName: 游戏名字
runlnBackGround: 是否在后台运行
unityVersion: 判断unity的版本
OpenURL: 可以打开页面
sceneManager(场景管理器)
场景管理器用于管理场景的切换与销毁,加载
Static Variables
sceneCount 加载的场景数量
sceneCountlnBuildSettingss 加载列表中的场合
LoadScene 加载场景
LoadSceneMode 加载场景有两种模式Single (单独的):把所有的物体摧毁加载新的场景 Addditive: 不改变原来的场景下,加载新的场景
1 | using UnityEngine.seneManagement; |
LoadSceneAync 异步加载场景(h会返回一个AsynOperation的对象,利用AsyncOperation的progress对象会获得0到一的值,1代表完成,isDone,判断是否完成)
GetActiveScene:获得当前场景
1 | SceneManager.GetActiveScene().name; |
GetSceneByName: 用名字获取场景
GetSceneByPath: 用名字来获取场景
SetActiveScene: 激活某个场景,用来激活某个场景。
acticeSceneChanged: 加载某个场景的时候
sceneLoadded: 场景加载完成的时候触发
1 | void OnActiveSceneChanged(Scene a,Scene b) |