Unity常用API与类

常用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按照一定的时间间隔来触发这些事件。

延迟效果:在角色受到伤害后,延迟一段时间再显示血条减少的动画效果,或者在敌人死亡后,延迟播放爆炸特效等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值