赞
踩
一、事件函数执行的先后顺序
FixedUpdate每秒执行固定次数,应该将处理跟物理相关的运动的代码放在FixedUpdate中。
Update和LateUpdate跟硬件和代码性能有关,每秒执行次数不固定。
二、Time类中的静态变量
图中红色为只读值,绿色为可读可写:
Time.time 表示从游戏开始到现在的时间,会随着游戏的暂停而停止计算。
Time.timeSinceLevelLoad 表示从当前Scene加载完成到目前为止的时间,也会随着暂停操作而停止。
Time.deltaTime 表示从上一帧到当前帧(上一帧所消耗的)时间,以秒为单位。
Time.fixedTime 表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。
Time.fixedDeltaTime 表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。
Time.SmoothDeltaTime 表示一个平稳的deltaTime,根据前N帧的时间加权平均的值。
Time.timeScale 时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,非常有用。
Time.frameCount 已渲染总帧数。
Time.realtimeSinceStartup 表示自游戏开始后的总时间,即使暂停也会不断的增加,也不受timeScale影响。
Time.captureFramerate 表示设置每秒的帧率,然后不考虑真实时间。
Time.unscaledDeltaTime 不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。
Time.unscaledTime 不考虑timescale时候与time相同,若timescale被设置,则无效。
三、创建游戏物体的三种方法
1、通过构造方法创建
GameObject go = new GameObject();
2、通过GameObject.Instantiate()方法实例化
3、通过GameObject.CreatePrimitive()方法创建基本的游戏物体
创建出来的物体可以通过AddComponent<>添加组件。
四、游戏物体间消息的发送和接收
BroadcastMessage()向所有子物体包括自身广播消息。
SendMessage()向自身发送消息。
SendMessageUpwards()向所有父物体包括自身广播消息。
五、MonoBehaviour类
继承层次:Object->Component->Behaviour->MonoBehaviour
注意:复选框控件(在编辑中)仅仅会阻止Start、Awake、Update、FixedUpdate和OnGUI函数的执行,如果这些函数中没有一个出现,则复选框就不会显示。
调用方法Invoke(可用于延时):
CancelInvoke() 取消在这个脚本上的所有调用
void Invoke(string methodName, float time) 在time时间内调用名字为methodName的函数
void InvokeRepeating(string methodName, float time, float repeatRate) 在time时间内调用名字为methodName的函数,此后每
repeatRate秒就调用一次该函数
bool IsInvoking() 该MonoBehaviour上是否有等候调用的函数
协程:
StartCoroutine(IEnumerator routine) 开启一个协程,利用yield语句暂停在某点,yield返回值指定了什么时机协程恢复。对于多帧执行一次的行为非常适合用协程解决,它几乎没有什么性能开销。该函数总是会立即返回,然而可以yield结果,这样可以等到协程执行完成返回。使用javascript不需要显示调用该函数,因为编译器已经为你调用了,而C#中必须显示调用。
StartCoroutine(string methodName, object value = null) 开启指定名字的协程。主要应用的场合是,当使用指定函数名字来开启协程时,就可以使用StopCoroutine来终止指定名字的函数。限制是仅能传递一个参数,而且有更高的运行时代价。
StopAllCoroutines() 终止运行在该MonoBehaviour上的所有协程。
StopCoroutine(string methodName) 终止运行在该MonoBehaviour上名字为methodName的协程。仅仅StartCoroutine的字符串开启的协程才可以使用该函数进行终止。
消息:
void Reset(); 当脚本第一次被挂到object上或用户点击Inspector视图中Reset按钮时,Reset函数被调用来初始化脚本属性。Reset函数仅可以在编辑模式下被调用,最常用于在Inspector视图中呈现好的默认值。
void OnValidate(); 当脚本被加载或Inspector中某个值被改变时,该函数被调用,仅能在编辑器状态下使用。用于确保在编辑器中修改数据,该数据可以保持在特定范围内。
void OnLevelWasLoaded(int level); 当一个新的level被加载之后调用该函数,可以做协程。可以在File->Build Settings中看到该level具体指的是哪个Scene。
void Awake(); 游戏启动之前用于初始化任何变量和游戏状态,在脚本实例生命周期中仅被调用一次,不能做协程。Awake函数是在所有objects实例化之后被调用的,因而可以安全地同其它objects通信或查询等;同时,Awake函数是在任何Start函数之前被调用的,因而我们可以规定脚本的初始化顺序。objects之间Awake函数的调用没有先后顺序规定,因而可以利用Awake函数建立脚本之间的引用,再使用Start函数来回传递信息。(对于C#、Boo用户,当构造时组件序列化状态没有定义,就应该使用Awake代替构造函数来初始化)。
void Enable(); 只有object是激活状态下才可被调用,在object可用之后被调用,这通常发生于MonoBehaviour实例被创建时,不能做协程。
void Start(); 如果脚本实例是enabled的,则Start函数在第一帧更新之前被调用,在脚本实例生命周期中仅被调用一次。不论脚本enabled与否,Awake函数都会调用;假如初始化期间脚本disabled,则Start函数就不会与Awake函数在同一帧中被调用。Awake函数和OnEnable函数一定是在Start函数之前调用(好处是:object A实例化代码依赖于object B实例化,B的实例化就应该在Awake阶段完成,A的实例化就在Start阶段完成)。注意:对于添加到场景中的objects,所有脚本的Start函数都会在任何脚本调用Update等函数之前被调用。但是,在gameplay期间实例化objects,就不能强制遵循这个规则了。
void OnDisable(); 当行为不可用或非激活时,该函数被调用。当对象被销毁时,或对于任何清理工作的代码,该函数同样可被调用。当编译完成之后重新加载脚本,该函数可被调用,脚本加载完成时调用OnEnable函数。该函数不可以做协程。
void OnDestroy(); 在对象存在的最后一帧中,OnDestroy这个函数在所有帧更新之后被调用,该函数仅仅会在那些先前状态为active的对象上被调用。对象被销毁来响应Object.Destroy或关闭一个场景,该函数不可以是协程。
void FixedUpdate(); 假如MonoBehaviour是enabled时,该函数在固定帧率的每帧中被调用一次。比Update函数的调用更频繁;当帧率比较低时,每帧可被多次调用,如果帧率比较高,就可能不会被调用;所有的物理计算和更新都在FixedUpdate函数之后立即发生;当在FixedUpdate函数中计算物体移动时,不需要乘以Time.deltaTime,因为FixedUpdate函数是基于可靠的定时器,与帧率无关。
void Update(); 假如MonoBehaviour是enabled时,该函数每帧被调用一次,是最主要最常用的帧更新函数。为了得到从上一帧调用Update函数到现在消耗的时间,需要使用Time.deltaTime。
void LateUpdate(); 假如MonoBehaviour是enabled时,该函数每帧被调用一次,在Update函数之后执行;LateUpdate函数最常应用于第三人称的相机跟随。(如果将角色的移动和旋转放在Update函数中,则可以把相机的移动和旋转都放在LateUpdate函数,从而在相机追踪到角色位置之前,确保角色已经完成了移动。
注意:协程在所有Update函数完成后执行;若在LateUpdate中开启了一个协程,它将在LateUpdate之后渲染之前也会被调用。
void OnAnimatorIK(int layerIndex);动画组件在更新它内部Inverse Kinematics(IK)系统之前调用该函数。可用于设置IK目标位置和他们各自的权重。
void OnAnimatorMove(); 用于修改根运动而处理动画移动时调用。在状态机和动画计算完,OnAnimationIK之前,每帧都会被调用。
void OnAppllicationFocus(bool); 当玩家获得或失去焦点时,该消息被发送到所有游戏对象。该函数可以是协程,假如其作为协程来执行,在初始化帧期间会被用到两次:第一次用作前期消息通知,第二次发生在正常的协程更新步骤中。
void OnApplicationPause(bool); 当玩家暂停游戏,该消息会被发送给所有游戏对象。若暂停被检测到,当前帧执行后就调用OnApplicationPause函数,在正常的帧更新之间调用是有效的。在OnApplicationPause函数被调用后,增加额外的一帧来显示图像表明暂停状态。OnApplicationPause函数可以是协程,假如其作为协程来执行,在初始化帧期间会被用到两次:第一次用作前期消息通知,第二次发生在正常的协程更新步骤中。
void OnApplicationQuit(); 在应用退出之前所有的游戏对象都会调用该函数。在编辑器中当用户停止播放时它将被调用;在webplayer中,当网页关闭时被调用。注意,IOS应用通常暂停并不会退出,所以应该在IOS播放器设置中勾选“Exit on Suspend”,这样会使游戏退出而不是暂停。如果没有勾选就会调用OnApplicationPause函数。
void OnBecameInvisible();void OnBecameVisible(); 当object在任何相机中变得可见/不可见时被调用,该消息被发送到任何挂在渲染器上的脚本。使用这两个函数可以避免不必要的计算,仅当object可见时才进行相应的计算。它们可以是协程。当在编辑器中运行时,场景视图摄像机也会导致它们被调用。
void OnCollisionEnter(Collision collision); 当该碰撞器/刚体开始接触到另一个刚体/碰撞器的时候,该函数被调用,可以做协程。和OnTriggerEnter函数相比,OnCollisionEnter的参数是Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息,如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息,这样可以避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。
void OnCollisionEnter2D(Collision2D collision); 当传进来的Collider和对象的Collider有接触时该函数被调用(仅限于2D物理)。
void OnCollisionExit(Collision collision); 当该碰撞器/刚体停止碰撞另一个刚体/碰撞器时被调用,可以做协程。和TriggerExit函数相比,OnCollisionExit 参数是Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息,如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息,这样可以避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。
void OnCollisionExit2D(Collision2D collision); 当传进来的Collider和对象的Collider停止接触时该函数被调用(仅限于2D物理)。
void OnCollisionStay(Collision collision); 对于每一个正在碰触其他刚体/碰撞器的碰撞器/刚体,该函数每帧都会被调用一次,可以做协程。和OnTriggerStay函数相比,OnCollisionStay参数是Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息,如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息,这样可以避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。
void OnCollisionExitStay2D(Collision2D collision); 当一个对象的Collider和这个对象的Collider正在碰撞时该函数被调用(仅限于2D物理)。
void OnControllerColliderHit(ControllerColliderHit); 当控制器执行时移动时碰到一个Collider上,该函数被调用。当它们碰撞到角色上时被用于推开对象。
void OnParticleCollision(GameObject); 当一个粒子撞到碰撞器上时该函数被调用。用于游戏对象受粒子碰撞时的伤害计算。
void OnConnectedToServer(); 当成功连接到服务器时客户端调用该函数。
void OnDisconnectedFromServer(NetworkDisconnection); 当与服务器连接中断或终止连接时,该函数被调用。
void OnFailedToConnect(); 由于某些原因尝试连接失败时,客户端调用该函数。
void OnFailedToConnectToMasterServer(NetworkConnectionError); 连接到主服务器有问题时服务器端或客户端调用该函数。
void OnMasterServerEvent(MasterServerEvent); 当收到来自主服务器报告事件,该函数被客户端或服务器端调用。
void OnServerInitialized(); 不论何时Network.InitializeServer被触发并完成,服务器会调用该函数。
void OnSerializeNetworkView(BitStream, NetworkMessageInfo); 用于定制脚本中变量的同步,从网络的视角来看。自动决定是否序列化的变量应该被发送或接收。
void OnPlayerConnected(NetworkPlayer); 不论何时玩家成功连接到服务器时,服务器端调用该函数。
void OnPlayerDisconnected(NetworkPlayer); 不论何时玩家与服务器失去连接时,服务器端调用该函数。
void OnNetworkInstantiate(NetworkMessageInfo); 使用Network.Instantiate,对象被网络实例化时被调用。
void OnPreCull(); 在相机剔除场景前被调用,剔除确定了哪些物体在相机中是可见的。仅当脚本挂在相机上并且是enabled时,该函数才会被调用。假如要修改相机的可视化参数(比如FOV,Transform等),就应该在这个函数中进行修改,此后场景中objects的可见性就取决于相机的参数了。
void OnWillRenderObject(); 如果物体可见并且MonoBehaviour是enabled时,在渲染每个经过剔除操作之后的物体之前,它将为每个相机调用一次。
void OnPreRender(); 仅当脚本挂在相机上并且是enabled时,则在相机开始渲染场景之前被调用。假如在这个函数中修改了相机的可视化参数(比如FOV),那么这些参数只会在下一帧中起到作用。该函数可以是协程。
void OnPostRender(); 在相机完成场景的渲染后被调用。与OnRenderObject不同,仅当脚本挂在相机上并且是enabled时,该函数才会被调用。该函数可以做协程。假如想要在所有相机和GUI渲染之后做操作,使用WaitForEndOfFrame协程。
void OnRenderObject(); 在所有固定场景渲染之后被调用,此时你可以使用GL类函数或者Graphics.DrawMeshNow来画自定义的几何体。该函数和OnPostRender函数相似,除了一点:不论脚本挂在相机上与否,OnRenderObject函数都会在任何挂有定义了该函数的脚本的object上被调用。
void OnRenderImage(RenderTexture, RenderTexture); 在场景渲染完成后被调用,用于对屏幕的图像进行后处理,该消息被发送到挂到相机上的所有脚本。该函数允许利用基于shader的过滤器对最终图像进行处理,传入源渲染纹理,终止于目标渲染纹理;当相机有多个图像过滤器时,按照图像顺序进行处理,前一个过滤器的目标渲染纹理作为下一个过滤器的源渲染纹理。
void OnGUI(); 假如MonoBehaviour是disabled时,该函数不会被调用。为响应GUI事件,该函数每帧被调用多次,每个事件就调用一次;执行时先响应布局和重绘事件,随后是为每一次的输入事件执行布局和键盘/鼠标事件。
void OnDrawGizmos(); 为了可视化的目的,在场景视图中绘制小图标。该函数使用相对于Scene视图的鼠标的位置,允许快速挑选场景中重要的objects,当然假如组件在inspector中collapsed,则该函数就不会被调用。
void OnDrawGizmosSelected(); 同OnDrawGizmos,不过只有选中的物体执行。
void OnMouseEnter(); 当鼠标进入GUIElement或Collider时该函数被调用,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。可以做协程。
void OnMouseExit(); 当鼠标离开GUIElement或Collider时该函数被调用,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。可以做协程。
void OnMouseDown(); 当用户在GUIElement或Collider上按下鼠标时该函数被调用,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。可以做协程。
void OnMouseUp(); 当用户释放鼠标按键时,该函数被调用,即使鼠标已经不在和鼠标按下相同的一个GUIElement或Collider上时该函数被调用。可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseUpAsButton(); 当用户释放鼠标按键时,该函数被调用,只在和鼠标按下相同的一个GUIElement或Collider上时该函数被调用。可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseDrag(); 当用户在GUIElement或Collider上点击鼠标并一直按着时该函数被调用,按着鼠标的每一帧中该函数都会被调用,可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseOver(); 当鼠标在GUIElement或Collider上时该函数被调用,按着鼠标的每一帧中该函数都会被调用,可以做协程,该消息会被发送给Collider或GUIElement的所有脚本。该函数不能被属于忽略Raycast layer的对象来调用。
void OnTriggerEnter(Collider); 当碰撞器进入触发器时该函数被调用。该消息被发送给触发器碰撞器和碰到触发器的刚体(假如没有刚体就是碰撞器),但只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送。该函数可以做协程。
void OnTriggerEnter2D(Collider2D); 当另一个对象碰到这个对象上挂有的触发器碰撞器时,该消息被发送(仅仅2D物理适用)。
void OnTriggerExit(Collider); 当另一个碰撞器停止碰撞该触发器时该函数被调用。该消息被发送给触发器和碰撞触发器的碰撞器。注意,只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送。该函数可以做协程。
void OnTriggerExit2D(Collider2D); 当另一个对象离开这个对象上挂有的触发器碰撞器时,该消息被发送(仅仅2D物理适用)。
void OnTriggerStay(Collider); 对于每一个正在碰撞该触发器的碰撞器,该函数每帧被调用一次。该消息会被发送给触发器和碰撞该触发器的碰撞器,注意,只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送。该函数可以做协程。
void OnTriggerStay2D(Collider2D); 当另一个对象在该对象的触发器碰撞器内时该函数每帧被都会被调用。(仅仅2D物理适用)
void OnJointBreak(float); 当连接到同一游戏对象上的关节断裂时被调用。当外力高于关节的breakForce时,关节会断开。当关节断开时,该函数被调用,施加于关节处的断裂外力会被做为参数传入。当该函数完成后,关节会自动从游戏对象上移除。
六、Mathf类
Mathf.Abs 绝对值 计算并返回指定参数 f 绝对值。
Mathf.Acos 反余弦
static function Acos (f : float) : float 以弧度为单位计算并返回参数 f 中指定的数字的反余弦值。
Mathf.Approximately近似
static function Approximately (a : float, b: float) : bool 比较两个浮点数值,看它们是否非常接近, 由于浮点数值不精确,不建议使用等于来比较它们。例如,1.0==10.0/10.0也许不会返回true。
Mathf.Asin反正弦
static function Asin (f : float) : float 以弧度为单位计算并返回参数 f 中指定的数字的反正弦值。
Mathf.Atan2反正切
static function Atan2 (y : float, x :float) : float 以弧度为单位计算并返回 y/x 的反正切值。返回值表示相对直角三角形对角的角,其中 x 是临边边长,而 y 是对边边长。
返回值是在x轴和一个二维向量开始于0个结束在(x,y)处之间的角。
Mathf.Atan反正切
static function Atan (f : float) :float 计算并返回参数 f 中指定的数字的反正切值。返回值介于负二分之 pi 与正二分之 pi 之间。
Mathf.CeilToInt最小整数
static function CeilToInt (f : float) : int 返回最小的整数大于或等于f。
Mathf.Ceil上限值
static function Ceil (f : float) : float 返回 f 指定数字或表达式的上限值。数字的上限值是大于等于该数字的最接近的整数。
Mathf.Clamp01限制0~1
static function Clamp01 (value : float) :float 限制value在0,1之间并返回value。如果value小于0,返回0。如果value大于1,返回1,否则返回value 。
Mathf.Clamp限制
static function Clamp (value : float, min :float, max : float) : float 限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value
static function Clamp (value : int, min :int, max : int) : int 限制value的值在min和max之间,并返回value。
Mathf.ClosestPowerOfTwo最近的二次方
static function ClosestPowerOfTwo (value :int) : int 返回距离value最近的2的次方数。
Mathf.Cos余弦
static function Cos (f : float) : float 返回由参数 f 指定的角的余弦值(介于 -1.0 与 1.0 之间的值)。
Mathf.Deg2Rad度转弧度
static var Deg2Rad : float 度到弧度的转化常量。(只读) 这等于(PI * 2) / 360。
Mathf.Mathf.Rad2Deg 弧度转度
static var Rad2Deg : float 弧度到度的转化常量。(只读) 这等于 360 / (PI * 2)。
Mathf.DeltaAngle增量角
static function DeltaAngle (current :float, target : float) : float 计算给定的两个角之间最短的差异。
Mathf.Epsilon小正数
static var Epsilon : float 一个很小的浮点数值。(只读) 最小的浮点值,不同于0。
以下规则:
- anyValue + Epsilon = anyValue
- anyValue - Epsilon = anyValue
- 0 + Epsilon = Epsilon
- 0 - Epsilon = -Epsilon
一个在任意数和Epsilon的之间值将导致在任意数发生截断误差。
Mathf.Exp指数
static function Exp (power : float) : float 返回 e 的 power 次方的值。
Mathf.FloorToInt最大整数
static function FloorToInt (f : float) :int 返回最大的整数,小于或等于f。
Mathf.Floor下限值
static function Floor (f : float) : float 返回参数 f 中指定的数字或表达式的下限值。下限值是小于等于指定数字或表达式的最接近的整数。
Mathf.Infinity正无穷
static var Infinity : float 表示正无穷,也就是无穷大,∞ (只读)
Mathf.InverseLerp反插值 计算两个值之间的Lerp参数。也就是value在from和to之间的比例值。
Mathf.IsPowerOfTwo是否2的幂
static function IsPowerOfTwo (value : int): bool 如果该值是2的幂,返回true。
Mathf.LerpAngle插值角度
static function LerpAngle (a : float, b :float, t : float) : float 和Lerp的原理一样,当他们环绕360度确保插值正确。 a和b是代表度数。
Mathf.Lerp插值
static function Lerp (from : float, to :float, t : float) : float 基于浮点数t返回a到b之间的插值,t限制在0~1之间。 当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。
Mathf.Log10基数10的对数
static function Log10 (f : float) : float 返回f的对数,基数为10。
Mathf.Log对数
static function Log (f : float, p : float): float 返回参数 f 的对数。
Mathf.Max最大值
static function Max (a : float, b : float): float
static function Max (params values :float[]) : float
返回两个或更多值中最大的值。
Mathf.Min最小值
static function Min (a : float, b : float): float
static function Min (params values :float[]) : float
返回两个或更多值中最小的值。
Mathf.MoveTowardsAngle移动角
static function MoveTowardsAngle (current :float, target : float, maxDelta : float) : float
像MoveTowards,但是当它们环绕360度确保插值正确。
变量current和target是作为度数。为优化原因,maxDelta负值的不被支持,可能引起振荡。从target角推开current,添加180度角代替。
Mathf.MoveTowards移向
static function MoveTowards (current :float, target : float, maxDelta : float) : float
改变一个当前值向目标值靠近。
这实际上和 Mathf.Lerp相同,而是该函数将确保我们的速度不会超过maxDelta。maxDelta为负值将目标从推离。
Mathf.NegativeInfinity负无穷
static var NegativeInfinity : float 表示负无穷,也就是无穷小,-∞(只读)
Mathf.NextPowerOfTwo下个2的幂
Mathf.PingPong乒乓
static function PingPong (t : float, length: float) : float
0到length之间往返。t值永远不会大于length的值,也永远不会小于0。
The returned value will move back and forthbetween 0 and length.
返回值将在0和length之间来回移动。
Mathf.PI圆周率
static var PI : float PI(读pai)的值,也就是圆周率(π)的值3.14159265358979323846...(只读)
Mathf.Pow次方
static function Pow (f : float, p : float): float 计算并返回 f 的 p 次方。
Mathf.Repeat重复
static function Repeat (t : float, length :float) : float
循环数值t,0到length之间。t值永远不会大于length的值,也永远不会小于0。 这是类似于模运算符,但可以使用浮点数。
Mathf.RoundToInt四舍五入到整数
static function RoundToInt (f : float) :int
返回 f 指定的值四舍五入到最近的整数。 如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Round四舍五入
static function Round (f : float) : float
返回浮点数 f 进行四舍五入最接近的整数。 如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Sign符号
static function Sign (f : float) : float 返回 f 的符号。 当 f 为正或为0返回1,为负返回-1。
Mathf.Sin正弦
static function Sin (f : float) : float 计算并返回以弧度为单位指定的角 f 的正弦值。
Mathf.SmoothDampAngle平滑阻尼角度
static function SmoothDampAngle (current :float, target : float, ref currentVelocity : float, smoothTime : float,maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : float
参数
current
当前的位置。
target
我们试图达到的位置。
currentVelocity
当前速度,这个值在你访问这个函数的时候会被随时修改。
smoothTime
the target faster.
要到达目标位置的近似时间,实际到达目标时要快一些。
maxSpeed
可选参数,允许你限制的最大速度。
deltaTime
上次调用该函数到现在的时间。缺省为Time.deltaTime。
随着时间的推移逐渐改变一个给定的角度到期望的角度。
这个值通过一些弹簧减震器类似的功能被平滑。这个函数可以用来平滑任何一种值,位置,颜色,标量。最常见的是平滑一个跟随摄像机。
Mathf.SmoothDamp平滑阻尼
static function SmoothDamp (current :float, target : float, ref currentVelocity : float, smoothTime : float,maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : float
参数
current
当前的位置。
target
我们试图达到的位置。
currentVelocity
当前速度,这个值在你访问这个函数的时候会被随时修改。
smoothTime
要到达目标位置的近似时间,实际到达目标时要快一些。
maxSpeed
可选参数,允许你限制的最大速度。
deltaTime
上次调用该函数到现在的时间。缺省为Time.deltaTime。
描述
随着时间的推移逐渐改变一个值到期望值。
这个值就像被一个不会崩溃的弹簧减振器一样被平滑。这个函数可以用来平滑任何类型的值,位置,颜色,标量。
Mathf.SmoothStep平滑插值
static function SmoothStep (from : float,to : float, t : float) : float
和lerp类似,在最小和最大值之间的插值,并在限制处渐入渐出。
Mathf.Sqrt平方根
static function Sqrt (f : float) : float 计算并返回 f 的平方根。
Mathf.Tan正切
static function Tan (f : float) : float 计算并返回以弧度为单位 f 指定角度的正切值。
七、Quaternion类
常用变量:
identity 不旋转
eulerAngles 将四元数转换成欧拉角
常用方法:
Euler 将欧拉角转换成四元数
LookRotation 设置朝向
Vector3 dir = enemy.position - player.position;
dir.y = 0;
player.rotation= Quaternion.LookRotation(dir); //设置Player朝向Enemy
Slerp 插值(适用于球形有弧度或角度的插值)
Vector3 dir = enemy.position - player.position;
dir.y = 0;
Quaternion target = Quaternion.LookRotation(dir);
player.rotation = Quaternion.Slerp(player.rotation, target, Time.deltaTime);
八、Rigidbody
position 如果使用Rigidbody.position更改Rigibody的位置,则在下一个物理模拟步骤之后将会更新Transform。这比使用Transform.position更新位置要快,因为后者将导致所有附加的Colliders重新计算它们相对于Rigidbody的位置。如果想连续移动一个刚体,使用MovePosition来代替。
MovePosition 调用Rigidbody.MovePosition会导致渲染的任何中间帧中两个位置之间的平滑过渡。如果要在每个FixedUpdate中连续移动刚体,则应该使用此选项。 如果想将一个刚体从一个位置直接传送到另一个位置,不需要渲染中间位置,使用position设置位置。 如果刚体is Kinematic设置为false,调用Rigidbody.MovePosition还是会将一个刚体从一个位置直接传送到另一个位置。
playerRigidbody.position = playerRigidbody.position + Vector3.forward * Time.deltaTime * 100;//使用Rigidbody.position更改Rigibody的位置
playerRigidbody.MovePosition(playerRigidbody.position + Vector3.forward * Time.deltaTime * 100);//使用MovePosition来代替rotation
rotation、MoveRotation和以上相同。
AddForce 给刚体添加一个力(指定方向和大小)。
九、Application
dataPath 包含游戏数据文件夹的路径,不同平台路径不同。
streamingAssetsPath 在Unity项目的Assets下创建streamingAssets文件夹,保存包括视频、音频、AssetBundle资源,这些资源不会被打包。
http://blog.csdn.net/u011325034/article/details/49327225
http://www.jianshu.com/p/617789c9919a
https://www.cnblogs.com/colve/p/5149847.html
.........
十、SceneManager
sceneCount场景的总数。
sceneCountInBuildSettings在BuildSettings中的场景数量。
CreateScene 创建一个空的新场景并指定名称。
GetActiveScene获取激活的场景。
GetSceneAt获取在场景管理列表添加场景的索引。
GetSceneByName 通过场景添加到场景管理器的指定名称查找该场景。
GetSceneByPath 查找所有给定资源路径并添加到SceneManager中的场景。
LoadScene 通过在Build Settings中它们的名称或索引加载场景。
LoadSceneAsync 在后台异步加载场景。
MergeScenes 该属性将场景资源合并到destinationScene。该函数合并场景资源内容到目的场景并删除原场景资源。所有根资源场景下的物体移动到根目的场景目录下。注意:该函数是有破坏性的:当资源合并完成后原有资源场景将会被立刻销毁。
MoveGameObjectToScene 移动一个物体从它当前场景到一个新的场景中。它必须要求该物体在当前场景的根目录下。
SetActiveScene 设置被激活的场景。
UnloadScene 卸载所有和指定场景关联的物体。
1、Event Function:事件函数
2、Time时间类函数:
3、GameObject类:
【1】、创建游戏物体的三种方法:
【2】、 为游戏物体添加组件, 其中组件可以是我们自己自定义的脚本GameObject.AddComponent<组件名>
【3】、属性、变量:
【4】、UnityEngine.Object中的共有方法与变量
【5】、消息的发送
【6】、游戏组件的查找
4、MonoBehaviours的类:
【1】、继承的变量成员
【2】、Invoke等方法、变量:将添加要调用的方法添加到等待队列中,然后等待用户设定的时间后,进行队列中的方法调用。
扩充: 在脚本的类前添加[ExecuteInEditMode]:则该脚本不用按游戏运行按钮就会开始编译,只限在编辑模式里面
在脚本的共有变量前添加[HideInInspector]:则该共有变量不会在Inspector面板进行显示
5、Coroutines:协程:
1、定义协程:IEnumerator 方法名()
{
yield return 0/null ;
yield return new WaitForSeconds(1.0f); //等待一定时间在运行下面的代码
}
2、开启协程:StartCoroutines(方法名());
说明:协程开启会继续执行下面代码,不会等协程方法运行完再执行接下来的方法
3、开启与关闭协程时,StartCoriutine(参数)、StopCoroutine(参数) 其中的参数要互相对应,如果传递的是方法名,则两个方法中的参数就要是方法名,如果是IEnumerator的返回值,则其中两个方法发的参数就要是IEnumerator的返回值
1、 private IEnumerator coroutine;
coroutine = WaitAndPrint();
StartCoroutine(coroutine);
StopCoroutine(coroutine);
2、StartCoroutine("WaitAndPrint");
StopCoroutine("WaitAndPrint");
4、StopAllCoroutines() 停止所有的协程,不管你是怎么调用的
6、OnMousexx鼠标触发事件: 如果是通过Collider进行触发检测的话,则要在设置中打开允许进行射线检测。
7、Mathf类:所有的成员均为静态的
Mathf.Abs() 返回绝对值的
Mathf.Ceil() 向上取整的,10.1--->11
Mathf.Clamp(value,min,max) 如果value的值在min--max之间的话就返回value,但是如果value的值小于min,则返回min,如果value的值大于max,则返回max,一般是用在控制角色血量,当玩家的血量减少的时候,不会出现出现低于0和大于100的情况 hp= Mathf.Clamp(hp,0,100);
Mathf.ClosePowerOfTwo(value): 取得离value的2次方最近的值
Mathg.DeltaAngke: 取得两个角度之间的最小夹角
Mathf.Floor 向下取整
Mathf.Pow(i,j) 取得i的j次方
Mathf.MoveToWards() 一般用来做移动控制,是匀速的运动,加速度固定的
Mathf.Lerp() 差值运算,一般是用来控制动画、运动,越往后运行的越慢的。
Mathf.PingPong(t,maxValue) 类似乒乓球的来回运动,起始 值是0,通过t变量来控制值由0向maxValue移动,当t大于maxValue的时候又向0进行移动,然后就这样的来回往复运动,一般t变量用时间Time.deltatime来进行控制的。
8、Input输入类:
GetKey() 按键一直按着时触发
GetKeyDown 按键被按下那一刻进行触发
GetKeyUp 按键被按下后抬起时触发
GetMouseButton(0/1/2) 1:左键 2:右键 3:中键 鼠标一直按着时触发
GetMouseButtonDown() 鼠标按下那一刻触发、
GetMouseButtonUp() 鼠标抬起的那一刻时触发
GetButtonDown()
GetButton()
GetButtonUp() 这三个的参数是用户自定义的虚拟按键进行触发,其他的和上面的一样
GetAxis("虚拟轴名") 通过按下的虚拟轴来返回-1~1之间的值,开始值是0,然后向-1/1进行渐渐的变化,有一定的加速度。一般用来控制运动的,比如是赛车的加速运动等
GetAxisRaw() 其他的和GetAxis差不多,就是少了渐变效果,返回值只有 0 1 -1三个
anyKeyDown 当任何按键被按下(包括鼠标按键)时返回true
anyKey 当任何按键被按着(包括鼠标)时返回true
mousePosition 返回鼠标在屏幕上的像素坐标,【屏幕坐标】z轴衡为0的
9、Vector2;二维向量
magnitude: 返回向量的长度
normalized; 返回这个向量长度为1的矢量,不管这个向量多长,也是返回1的矢量,只是返回值,不对原向量的值产生影响
Normalize() 无参数的,也是向量化,但是调用该方法会改变原向量值,使其的值被向量化 了
ClampMagnitude() ;将一个向量限制在参数中指定的长度之间
MoveToWards() 用来做匀速的运动,由一个位置向另一个位置进行移动
sqrMagnitude 对求向量的的长度时不进行开平方根运算了,减少性能的损耗,一般是用来比较两个向量的长度大小的。
其他的参考API文档即可,较为简单。
扩充:向量是结构体,为值类型,修改其中的变量的时候要整体进行修改,不能单独的进行单个变量的赋值修改
10、Vector3:三维变量
Cross() 插乘运算【左手法则】,通过两个向量来获得另一个向量的方向,然后进行相关的判断
Project() 投影运算
Reflect() 反射运算
Slerp() 按照角度进行插值,与lerp的按照位置信息进行插值的,一般用在炮台的旋转,使旋转的更加平滑
11、Random随机数类:
InitState(): 通过参数指定的种子,然后再调用Range()产生随机数的时候会依据种子来进行生成,则每一次运行所生成的随机数都是一样的,是伪随机数。一般要生成的随机数不同,可以设置参数为System.DataTime.Now.Ticks:通过时间戳来完成
insideUnitFCircle :在单位为1的园内随机生成一个位置信息,如果要在更大的圆中生成,则可以在后面*圆的半径信息。一般用来控制随机生成敌人的位置信息
insideUnitSphere: 在单位为1的球内随机生成一个位置信息,如果要在更大的球中生成,则可以在后面*圆的半径信息。
12、四元数 Quaternion:
欧拉角【eylarAngles】与面板中的值对应和四元数【rotation】之间是可以进行转换的,一般欧拉角是用来让用户可以直观的看到的,而四元数是用来控制内部的运算 的。
.eulerAngles 将四元数转变为欧拉角
Euler() 将欧拉角转变为四元数
.LookRotation() 让玩家通过设置四元数来进行望向敌人的旋转,将向量方向转变为四元数
Vector3 temp = enemy.position - player.position; //获得两个位置信息之间的变量,是主角望向敌人,所以要设置向量的方向是指向敌人的
enemp.y = 0; //如果不想主角在望向他的时候出现低头的情况,也就是y轴的值出现了变化了。
player.rotation= Quaternion.LookRotation(temp);
slerp() 在做朝向的旋转的时候,不建议使用lerp,而是建议使用slerp,使其的旋转朝向更为平滑,更加的自然
Quaternion target= Quaternion.LookRotation(temp);
player.rotation = Quaternion.Slerp(player.rotation, target, Time.deltaTime); //插值的缓慢旋转
13、Rigidbody:刚体组件,控制角色的移动
.position: 可以通过刚体来控制运动,在控制运动方面,使用rigibody.positon比transform.porition计算要快的多,相关的物理计算也是在刚体中计算好了,但是不建议使用这个方法来持续的控制物体的运动,不平滑,控制一两次的时候还可以使用
MovePosition() 对position的优化,其中利用了插值运算,一般持续运动的则使用这个方法,不出现卡顿的现象
,rotation:
MoveRotation 用来控制刚体的旋转的,一般不建议使用rotation,比较耗性能,建议使用MoveRotation(),然后配合Quaternion,slerp()进行使用,使其更加的平滑
AddForce() 为刚体添加力,一般可以用在赛车游戏中,当进行短时的加速则可以给以限定时间的AddForce方法
14、Camera;相机组件:
当相机的标签是main cream时,可以通过Camer.main来进行主相机cream组件的查找射线,用来检测鼠标在屏幕上的位置信息,以及触碰到什么
Ray ray = cameraMain.ScreenPointToRay(Input.mousePosition); //获得相机到鼠标之间的射线
RaycastHit hit; //用来存放射线检测到的游戏物体的信息的
bool temp = Physics.Raycast(ray, out hit); //进行射线检测
15、Application
SreeamingAcsets: 该文件下的资源不会被压缩,导入是什么类型还是什么类型,【主要是音频、视频资源】
dataPath: 工程文件路径
streamingAssetsPath: 可以通过文件流来进行读取的文件路径
persistenDataPath :可以实例的文件路径
tempporaryCachePath :临时的文件路径
Application.OpenURL("") 打开指定的网址
Application.Quit() 退出游戏的运行
.CapturScreenshot("游戏截图") 用来截图的,字符串为截图fileName
Application.identifier 标识名
.companyName 公司名
productName 产品名
instalMode 安装包名
isEditor 是否在编辑器模式
isFocused 是否在焦点
isMoliePlatform 是否是移动平台
isPlaying
isWebPlayer
platform 编辑器的平台
unityVersion unity版本号
version 项目文件版本号
runInBackground 是否可以在后台运行
UnityEditor.EditorApplication.isPlaying=false; //在编辑器模式下推出编辑状态
16、SceneManager场景类
SceneManager.LoadScene() 加载下一个场景,一般是用在另一个场景不是太大的情况下
SceneManager.LoadSceneAsync() 异步加载下一个场景,返回AsyncOperation类型,里面包含了加载的信息,加载的进度条等等。可以让用户缓解等待加载场景的时间
sceneCount 获得当前加载的场景个数
sceneCountInBuildSettings 在Build面板中加载的场景个数
GetActiveScene() 获取已经加载的当前场景的信息
GetSceneAt(index) 加载index索引的场景
当加载新的场景的时候会触发下面的事件:
activeSceneChanged 当有新场景被加载的时候就会调用这个事件
sceneLoaded 当有新场景加载完成的时候就会触发这个事件
扩充:事件的注册时通过加方法来进行注册的:
SceneManger.activeSceneChanged+=OnAcitiveScenenChanged;
17、射线检测:一般射线检测要在射线检测的范围内,并且被检测物体要有Collider
Ray ray=new Ray(起点,方向);
PaycastHit hit; //hit中存放的是射线检测的碰撞信息
bool temp=Physics.Raycast(ray,out hit); //具体的重载方法边用边查
Ray ray = new Ray(this.transform.position + transform.forward, transform.forward); //创建射线
RaycastHit hit; //存储射线检测到的游戏物体信息
if(Physics.Raycast(ray,out hit)) //通过返回值来判断射线是否检测到相关的物体了
{
Debug.Log(hit.collider.gameObject.name);
}
扩充:
Raycast;检测的是射线碰撞到的第一个物体,不具有穿透性
RaycastAll:返回的是RaycastHit数组,具有穿透性,可以返回检测到的多个游戏物体
18、代码监听触发事件:
<Button>().onClick.AddListener(方法名); //当触发button组件,则会触发指定的方法名的方法
通过实现接口来注册监听事件: using UnityEgine.EventSystems; 导入命名空间
IPointerDownHandler 鼠标按下的事件,具体的接口参考手册
Raycast Target: 如果取消勾选则不做事件监听了,则无法实现检测了
19、www类,下载 是用来在网络中下载资源的,
public string url = "http://img.taopic.com/uploads/allimg/120727/201995-120HG1030762.jpg";
IEnumerator Start()
{
WWW www = new WWW(url);
yield return www;
Renderer renderer = this.GetComponent<Renderer>();
renderer.material.mainTexture = www.texture;
}
20、Touches触摸事件:
Input.touches: 返回放在屏幕上的手指信息,返回数组
Touch touch1=Input.touches[0];
touch1.position;
TouchPhase pahse=touch1.phase phase 是用来返回手指的状态的
21、Debug.DrawRay(ray.oridin,ray.direction) 绘制射线,第一个参数是原点,第二个是方向
22、CharacterController角色控制器
.SimpleMove(【vector3】) 简单移动
.isGrounded 判断是否到地面上,bool值
.Move() 与simpleMove的区别是要*Time.deltatime、而且simpleMove会使用自带的重力
OnCOntrollerColliderHit(ControllerCollidrHit hit) 当有碰撞到其他的碰撞器的时候会触发这个事件函数【hit保存碰撞到的物体信息】
23、Mesh的设置:
material mesh指定人是什么样子的,material指定人的肤色是什么样子的
24、API变更:
弃用:Application.LoadLevel();
新的:SceneManager.LoadScene(); 加载新的场景
弃用
新的:Scene scene=SceneManager.GetActiveScene(); //获得当前活动场景的信息
SceneManger.LoadScene(scene.buildIndex) //重新加载当前场景
OnLevelWasLoaded() 当场景被加载的时候调用,被弃用了
改成事件了:sceenLoaded
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。