前言
这个文档的内容来源于我一年多前的学习笔记。
Unity的版本也同时在飞速的提升,因此文章中可能会存在过时的API,请各位看客以各版本的官方文档为准。
大家可以通过“Ctrl+F”进行API检索
常用API汇总
关于Input
Input.GetKey(); //按下某键后,持续返回true
Input.GetKeyDown(); //按下某键的一瞬间,返回true
Input.GetKeyUp(); //抬起某键的一瞬间,返回true
返回值:bool 类型
参数:KeyCode.枚举(Enum)
KeyCode:键码,保存了物理键盘按键“索引码”。
Input.GetMouseButton(); //按下某键后,持续返回true
Input.GetMouseButtonDown(); //按下某键的一瞬间,返回true
Input.GetMouseButtonUp(); //抬起某键的一瞬间,返回true
返回值:bool 类型
参数:鼠标按键索引值,0->左键, 1->右键, 2->中键。
关于Rigidbody
Rigidbody.MovePosition(Vector3):使用刚体移动物体的位置。
使用刚体移动物体,物体是根据世界坐标系的方向移动的。
使用刚体移动物体,物体会触发物理相关的事件。
MovePosition 中的Vector3 要使用“当前位置”+ 方向的方式。
Transform.Position:属性当前的位置。
Rigidbody.MovePosition(Vector3):使用刚体移动物体的位置。
使用刚体移动物体,物体是根据世界坐标系的方向移动的。
使用刚体移动物体,物体会触发物理相关的事件。
MovePosition 中的Vector3 要使用“当前位置”+ 方向的方式。
Transform.Position:属性当前物体的位置。
AddForce():给刚体添加一个力,让刚体按“世界坐标系”进行运动。
Rigidbody.AddForce(Vector3,ForceMode);
Vector3:力的方向和大小;
ForceMode:力的模式[enum 类型]。
类型为枚举类型,以什么样的方式添加力给刚体。
枚举值说明
Acceleration:(加速度);
Force:(力)这种模式通常用于设置真实的物理;
Impulse:(冲击力)这种模式通常用于瞬间发生的力;
VelocityChange:(速度的变化);
AddRelativeForce():给刚体添加一个力,让刚体按“自身坐标系”进行运动。
Rigidbody.AddRelativeForce(Vector3,ForceMode);
Vector3:力的方向和大小;
ForceMode:力的模式[enum 类型]。
Update与FixedUpdate
FixedUpdate():固定更新方法。
所有和物理相关的操作,代码都要写在FixedUpdate()方法体内。
固定更新的时间间隔是0.02 秒,1 秒执行50 次。
Edit-->Project Settings-->Time 面板中的Fixed Timestep 参数设置。
Update():每帧执行一次。
画面每渲染完一次,就是一帧,每帧的时间是不固定的。
在Update()方法中执行物理操作,会出现卡顿的情况。
碰撞事件监测方法
OnCollisionEnter(Collision)
当碰撞开始时调用,只会调用该方法一次。
OnCollisionExit(Collision)
当碰撞结束时调用,只会调用该方法一次。
OnCollisionStay(Collision)
当碰撞进行中时,会持续调用该方法。
Collision 参数
碰撞,一个类。
作用:用于传递碰撞信息(要写形式参数 比如Collision coll)
Collision.gameObject 属性,与当前物体碰撞的物体的引用。
gameObject.name 属性,当前物体的名字。
比如coll.gameObject.name就是获取当前物体碰撞物体的名字
触发事件监测方法
触发器:将碰撞体组件属性面板上的“Is Trigger”选项选中,当前的游戏物体的碰撞体
就变成了触发器。
移动的刚体物体会穿透碰撞体勾选了“Is Trigger”的物体。
OnTriggerEnter(Collider)
当进入触发范围时开始时调用,只会调用该方法一次。
OnTriggerExit(Collider)
当离开触发范围时开始调用,只会调用该方法一次。
OnTriggerStay(Collider)
在触发范围内,会持续调用该方法。
Collider 参数(和Collision参数相似)
碰撞体,一个类。作用:用于传递触发信息。
Collider.gameObject 属性,进入触发范围内的目标物体的引用。
gameObject.name 属性,当前物体的名字。
鼠标事件方法
OnMouseEnter() :鼠标进入
OnMouseExit() :鼠标离开
OnMouseDown() :鼠标按下[单击]
更换颜色
变量.color = color.颜色;
AudioSource 常用函数
Play() 函数
播放音频剪辑。
Stop() 函数
停止播放。
Pause() 函数
暂停播放。
通过Tag 标签查找N 个物体
GameObject.FindGameObjectsWithTag(string):[静态方法]
通过特定的标签,查找到所有“贴有”该标签的游戏物体,返回一个数组。
String:标签名
查找游戏物体
GameObject.Find(string):[静态方法] 通过名字查找游戏物体
String 游戏物体的名字
FindGameObjectWithTag返回的是一个数组,要定义一个数组来储存,
Find只是查找某一个物体(可以继续点出下面的组件)
旋转物体
使用Transform.Rotate(Vector3,float)旋转物体:
Vector3:沿某个轴向旋转
Float:旋转的度数
实例化生存物体
GameObject.Instantiate(Object, Vector3, Quaternion);
Object:用于实例化的预制体;
Vector3:实例化后生成的物体所在的位置;
Quaternion[四元数]:实例化后生成的物体的旋转状态;
Quaternion.identity:无旋转;
生成随机数
Random.Range(min, max)
在min 和max 直接随机生成一个随机数。
销毁游戏物体
GameObject.Destroy(Object, float);定时销毁某个游戏物体。
Object:要销毁的游戏物体;
float:时间,多少秒后销毁;
发送信息
SendMessage 函数
gameObject.SendMessage(string):通知这个游戏物体身上的脚本文件中的“指定方法”执行。
String:方法名,要执行的方法的名字
延迟执行
Invoke(string,float):多少秒后执行某个函数[只会调用一次]。
String:要执行的函数的名称;
Float:秒数,倒计时的时间;
InvokeRepeating(string,float,float):
多少秒[第二个参数]后执行某个函数,
并且以后每隔多少秒[第三个参数]都会执行该函数一次[重复调用N 次]。
String:要执行的函数的名称;
Float:秒数,准备时间,预热时间;
Float:秒数,重复调用的间隔时间;
CancelInvoke():取消这个脚本中所有的Invoke 调用。
协同程序
协同程序就是一个“代码片段”,
往往我们需要将这个代码片段封装成一个方法,或者称之为函数。
协程全称协同程序,与线程类似,每一个应用程序都对应一个进程,每一个进程都有一个主线程,而协程在主线程之中,
因而使用了还是单线程,不能理解为多线程,应是主线程的一部分。
常用于使用动画时同步代码,时间等待,资源加载,场景切换等等
IEnumerator Task3()
{
yield return new WaitForSeconds (2);
Debug.Log ("任务3");
}
参数说明:
IEnumerator:协同程序的返回值类型;
yield return:协同程序返回xxxxx;
new WaitForSeconds (秒数):实例化一个对象,等待多少秒后继续执行。
开启协同程序
StartCoroutine(“协同程序方法名”);
这个StartCoroutine 有三种重载形式,目前先只介绍这一种。
停止协同程序
StopCoroutine(“协同程序方法名”);
这个StopCoroutine 也有三种重载形式,目前先只介绍这一种。
Screen 屏幕类
作用:这个类中包含屏幕相关的数据信息。
类中常用属性
Screen.width:静态只读属性,屏幕的宽度。
Screen.height:静态只读属性,屏幕的高度。
备注:在Unity 的开发模式下,这两个值取的是Game 窗口的宽度和高度。
在项目编译打包后,再运行,就是具体的设备的屏幕的宽度和高度。
Time 时间类作用
这个类中包含时间相关的数据信息。
类中常用属性:
Time.time
静态只读属性,游戏时间。从游戏开始到现在所经过的秒数。
Time.deltaTime
静态只读属性,时间增量。渲染完上一帧画面所消耗的时间。
[可以用于实现倒计时效果]
Time.timeScale
静态属性,时间缩放。[可以用于暂停游戏]
当值为1 时,游戏是正常状态;为0 时,游戏是暂停状态;为0.5 时,游戏是
处于慢放0.5 倍的状态。
Mathf 数学类
作用:这个类(其实Mathf 是结构体类型)中包含了各种各样的数学运算相关的函数。
常用函数
Mathf.Abs() 取绝对值
Mathf.Max() 取最大值
Mathf.Min() 取最小值
Mathf.Round() 四舍五入
插值运算函数
Mathf.Lerp(float a,float b,float t) :插值运算
基于浮点数t 返回a 到b 之间的插值,t 限制在0~1 之间。
当t = 0 返回a,当t = 1 返回b。当t = 0.5 返回a 和b 的平均值。
备注:Lerp()这个函数,在很多类中都存在,
插值运算的目的基本都是为了“平滑过渡”。
通过摄像机创建射线
Camera.main:代表tag 设置为“MainCamera”的摄像机的Camera 组件的引用。
m_Camera.ScreenPointToRay(Vector3):
摄像机组件(对象)下的一个方法。
屏幕点转化为射线,这个方法会返回一个Ray 类型的射线。
这个屏幕点通常写鼠标的点击位置,这样的话,就代表从摄像机的位置开始,往
鼠标点击点这个方向,发射一根射线。
Input.mousePosition:鼠标所在的位置值。
Ray:射线,一个结构体。
代码完整格式:
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
检查射线与其他物体的碰撞
RaycastHit
一个结构体,用于存储射线的碰撞信息。
Physics.Raycast(Ray, out RaycastHit)
物理类下面有一个静态方法叫做Raycast(),射线检查。
这个方法有16 个重载方式,我们现在使用第3 种重载方式。
第3 种重载:
检查这根射线,如果射线与场景中的物理碰撞了,返回值为真,并且将碰撞信息
存储到RaycastHit 类型的变量中。
物理射线使用步骤
第一步:创建一根射线。
第二步:检查这根射线与其他物体的碰撞,得到碰撞信息。
第三步:通过碰撞信息对碰撞到的物体进行处理。
射线碰撞检测发射子弹
RaycastHit.point
获取射线碰撞点。
Vector3 向量计算方向:
向量A - 向量B = 一个从B 点到A 点的方向。
也就是说,终点减去起点,可以获取到一个从起点到终点的方向。
Debug 绘制射线
射线是“虚无”的一个东西,就和WIFI 信号一样,真实存在,但我们看不到。
但有些时候,我们需要看到射线。
Debug.DrawRay(Vector3, Vector3,Color):绘制射线
第一个Vector3 是起点位置;
第二个Vector3 是目的点减去起点得到的一个方向;
Color 就是射线的显示颜色。
注意:Debug 绘制的射线,只能在Scene 窗口看到,运行后看不到。
如果想在运行后也看到,可以使用LineRenderer 组件绘制。
Debug 绘制测试线
枪口到碰撞点直接绘制一根测试线。
Debug.DrawLine(Vector3, Vector3, Color):绘制线
和Debug.DrawRay()用法一样。
Transform.LookAt(Vector3):朝向(面向)世界中的一个点。
场景背景模型添加碰撞器组件
添加Mesh Collider 组件,使用简模进行碰撞检测。
模型减面
简模模型的作用:降低物理运算资源消耗,提高游戏性能;
Vertices(verts):顶点个数,Mesh 网格是由顶点组成面,面组成体。
顶点个数越少,计算量越小。
在当前物体的子物体中查找游戏物体
Transform.FindChild(string)
枪口位置添加LineRenderer 组件
在枪口这个空游戏物体上添加LineRenderer 组件,设置相关属性。
LineRenderer.SetPosition(int,Vector3):设置线的位置。
int:位置的索引值;
Vector3:该位置所在的坐标值;
父子关系、获取组件
Transform.parent:属性,当前物体的父物体。
Transform.GetComponentsInChildren
GameObject.AddComponent
Transform.SetParent(Transform);:将当前的物体设置为另一个物体的子物体。
GameObject.GetComponent
GameObject.GetComponent
实例化资源
GameObject uiSprite = new GameObject("Monkey");:创建(实例化)一个名字叫做Monkey的对象(后面可以uiSprite.来代替GameObject,GameObject代表装载在当前组件的游戏物体)
Resources.Load