常用API和类
一、GameObject游戏物体函数
1.Gameobject.Find()
Gameobject.Find():通过名称查找场景中的游戏物体
void Start(){
GameObject player = GameObject.Find("player");
}
应用场景:在游戏初始化阶段,一次性查找特定的游戏对象
2.GameObject.SetActive()
GameObject.SetActive():设置GameObject的激活状态,激活的物体才会在场景中显示并参与逻辑运算
应用场景:控制UI面板、游戏对象的显示和隐藏,启动或禁用
3.AddComponent()
AddComponent():为游戏对象添加组件
void Start(){
gameObject.AddComponent<Rigidbody>();//添加刚体组件
}
应用场景:在运行状态下需要添加的组件,如刚体组件,output组件等等
二、Component组件
1.GetComponent();
GetComponent():用于获取GameObject上挂载的指定类型的组件
应用场景:在脚本中获取特定组件,以便对其进行操作和控制
注意:如果游戏对象上没有挂载指定类型的组件,该方法将返回null,因此在使用返回的组件前,最好进行非空判断
2.GetComponents()
GetComponents():获取游戏对象上挂载的所有指定类型的组件,返回一个组件数组
应用场景:当一个游戏对象上可能挂载多个相同类型的组件,需要对他们统一进行处理时使用
注意:即使游戏对象上只有一个指定类型的组件,该方法也会返回一个元素的数组
3.GetComponentsInChildren()
GetComponentsInChildren():获取游戏对象及其子物体上挂载的指定类型的组件
应用场景:在需要获取一个物体及其子物体上特定类型组件的情况下使用,如批量设置碰撞体的属性等
三、Message 消息
1.SendMessage()
SendMessage():用于向游戏对象上所有挂载的脚本发送指定名称的消息,可以携带参数,如:
//发送消息的脚本
private void OnMouseDown()
{
MainCamera.SendMessage("OnMouseMove", CameraL);
}
//接受消息的脚本
public void OnMouseMove(GameObject cameraL)
{
StartCoroutine(MoveCamera(cameraL.transform));
}
2.BroadcastMessage()
BroadcastMessage():与SendMessage()类似,但他会向游戏对象及其所有子物体上挂载的脚本发送消息
3.SendMessageUpwards()
SendMessageUpwards():向游戏对象及其所有物体上挂载的脚本发送消息
4.应用场景
消息系统在游戏开发中常用于实现组件之间的解耦。例如,在一个角色扮演游戏中,当角色受到伤害时,可以通过SendMessage()通知生命值管理组件进行相应的处理;在一个包含多个敌人的场景中,使用BroadcastMessage()可以方便地通知所有敌人执行某个动作,如进入战斗状态;SendMessageUpwards()则可以用于子物体向父物体汇报状态或请求某些操作,比如在一个 UI 界面中,子元素可以通过它向父级 UI 管理器发送事件消息。
另外
处理消息系统,还可以使用委托、事件等机制来实现脚本之间的通信。委托和事件在处理复杂的多对多通信关系时更加灵活和高效,并且可以提供更好的类型安全性。但是消息系统在一些简单的场景中,使用起来更加简洁直观
四、Coroutine 协程
协程是unity中一种强大的异步编程工具,它允许在不阻塞主线程的情况下执行一些需要等待的操作。这使得编写异步代码变得更加直观和易于管理,尤其是在处理延迟操作或需要顺序执行的任务时非常有用
1.定义与启动协程
//定义协程
IEnumerator MyCoroutine()
{
//协程逻辑
yield return null;//或者其他类型的指令,指定何时以及如何暂停协程
}
//启动协程
StartCoroutine(MyCoroutine());
2.yield指令
yield return null
:挂起协程直到下一帧开始。yield return new WaitForSeconds(float seconds)
:挂起协程指定的时间(秒)。yield return new WaitForEndOfFrame()
:挂起协程直到当前帧渲染完成。yield return new WaitForFixedUpdate()
:挂起协程直到下一个固定更新阶段。yield return new WWW(url)
:挂起协程直到从给定URL下载完成。- 自定义
YieldInstruction
:可以创建自己的等待条件。
3.结束协程
协程会自动结束,当它运行到最后一行或者遇到yield break语句
可以通过存储协程的引用并调用StopCoroutine手动停止特定的协程
Coroutine myCoroutine = StartCoroutine(MyCoroutine());
StopCoroutine(myCoroutine);
注意事项
- 性能影响:频繁地启动和停止大量的协程可能会影响性能。尽量减少不必要的协程创建,并考虑合并任务或使用其他异步机制。
- 生命周期管理:如果游戏对象被销毁,但其上还有正在运行的协程,这些协程将自动停止。
- 错误处理:在协程内部发生的未捕获异常会导致协程终止,并且不会继续执行后续的
yield
语句。因此,在协程中进行适当的错误处理是很重要的。 - 多线程限制:Unity的API大多数不是线程安全的,这意味着你不能直接从非主线程调用Unity API。尽管协程看起来像是多线程,但实际上它们是在主线程上逐帧执行的,因此适合用于实现异步逻辑而不是真正的并发计算。
应用场景
协程在游戏开发中有广泛的应用。在加载场景时,可以使用协程来显示加载进度条,同时异步加载资源;在制作动画效果时,通过协程实现动画的延迟播放和顺序播放;在网络通信中,等待服务器响应时不会阻塞主线程,保证游戏的流畅运行。
五、Invoke 延时调用
Invoke是unity中用于实现延时调用方法的功能,它可以在指定的时间后调用一个方法,或者按照一定的时间间隔重复调用另一个方法
1.单次延时调用
使用Invoke()
方法可以在指定的秒数后调用一个无参数的方法
//语法:Invoke(string methodName,float time)
void Start(){
Invoke("ToDo",3.0f);
}
void ToDo(){
//3秒后执行的函数
}
2.单次延时调用
InvokeRepeating()
方法用于按照固定的时间间隔重复调用一个方法
//语法:InvokeRepeating(string methodName,float time,float repeatRate)
void Start(){
InvokeRepeating("ToDo",3.0f,3f);//首次延迟3秒开始3秒后重复
}
void ToDo(){
//3秒后执行的函数
}
3.应用场景
技能冷却:如在王者农药中,当玩家释放技能后,可以使用Invoke
来设置技能的冷却时间,在冷却时间结束后,允许玩家再次使用该技能。
定时事件:比如在游戏中定时生成敌人、刷新道具等。可以通过InvokeRepeating
按照一定的时间间隔来触发这些事件。
延迟效果:在角色受到伤害后,延迟一段时间再显示血条减少的动画效果,或者在敌人死亡后,延迟播放爆炸特效等。