织梦可以做英文网站吗,网站开发流程有哪些,网站备案密码是什么,可以做样机图的网站文章目录 最终效果前言一、素材二、角色金币交互1. 拾取金币2. 显示金币数UI 完结 最终效果 前言
之前我们介绍过委托的用法#xff0c;具体可以跳转#xff1a;【unity小技巧】委托#xff08;Delegate#xff09;的基础使用和介绍
这期来讲讲事件#xff0c;使用你会发… 文章目录 最终效果前言一、素材二、角色金币交互1. 拾取金币2. 显示金币数UI 完结 最终效果 前言
之前我们介绍过委托的用法具体可以跳转【unity小技巧】委托Delegate的基础使用和介绍
这期来讲讲事件使用你会发现它和委托真的很像那么他们具体有什么区别呢
在Unity中事件Event和委托Delegate是两种不同的概念它们之间有一些区别 委托Delegate 委托是一种类型用于引用一个或多个方法。委托可以看作是函数指针或函数的代理。委托用于实现回调函数、事件处理和方法的动态绑定。委托是一种类型安全的方式来封装方法调用。 事件Event 事件是建立在委托之上的高级概念它提供了一种更加简洁、安全的方式来实现观察者模式。事件使用委托来通知其他对象或类当特定情况发生时让它们执行相应的操作。事件可以通过“”添加订阅者和“-”移除订阅者来管理委托的订阅和取消订阅。
何时使用事件和委托
当需要实现一对多的消息传递时可以使用事件。比如当某个对象的状态发生变化时需要通知多个其他对象做出相应的反应。当需要回调函数或方法引用时可以使用委托。比如当某个操作完成后需要执行特定的方法可以使用委托来实现回调。
综合来说事件和委托在Unity开发中都有各自的用途根据具体情况选择合适的方式来实现功能会更加方便和有效。
一、素材
https://assetstore.unity.com/packages/2d/environments/pixel-art-top-down-basic-187605
二、角色金币交互
1. 拾取金币
金币事件定义当金币增加时触发的事件
public class GoldEvents
{public event Actionint onGoldGained; // 当金币增加时触发的事件public void GoldGained(int gold) {onGoldGained?.Invoke(gold); // 触发金币增加事件}
}游戏事件管理中心初始化各种事件
public class GameEventsManager : MonoBehaviour
{public static GameEventsManager instance { get; private set; } // 单例实例public GoldEvents goldEvents; // 金币事件private void Awake(){if (instance ! null){Debug.LogError(在场景中找到多个游戏事件管理器); // 如果场景中存在多个游戏事件管理器则输出错误信息}instance this; // 设置单例实例为当前实例// 初始化所有事件goldEvents new GoldEvents(); // 初始化金币事件}
}挂载脚本
管理玩家的金币注册金币增加事件执行方法
// GoldManager类负责管理玩家的金币
public class GoldManager : MonoBehaviour
{[Header(Configuration)]// 游戏开始时玩家拥有的金币数量[SerializeField] private int startingGold 5;// 当前玩家持有的金币数量外部只能获取不能设置public int currentGold { get; private set; }// 在对象被激活时调用初始化玩家的金币数量private void Awake(){currentGold startingGold;}// 注册事件监听器private void OnEnable() {// 当玩家获得金币时注册GoldGained方法来处理事件GameEventsManager.instance.goldEvents.onGoldGained GoldGained;}// 注销事件监听器private void OnDisable() {// 当对象被禁用时取消注册GoldGained方法GameEventsManager.instance.goldEvents.onGoldGained - GoldGained;}// 处理获得金币的事件private void GoldGained(int gold) {// 增加玩家的金币数量currentGold gold;}
}配置脚本
设置脚本执行顺序在Unity的Project Settings中你可以通过Script Execution Order设置脚本的执行顺序确保GameEventsManager的Awake方法总是在其他依赖它的组件之前执行不然可能会报错。
定义金币脚本控制金币拾取和金币重新生成
[RequireComponent(typeof(CircleCollider2D))]
public class Coin : MonoBehaviour
{[Header(Config)][SerializeField] private float respawnTimeSeconds 8; // 重生时间[SerializeField] private int goldGained 1; // 获得的金币数量private CircleCollider2D circleCollider; // 圆形碰撞体private SpriteRenderer visual; // 视觉元素private void Awake() {// 初始化圆形碰撞体和视觉元素circleCollider GetComponentCircleCollider2D();visual GetComponentInChildrenSpriteRenderer();}// 收集金币的方法private void CollectCoin() {circleCollider.enabled false;visual.enabled false;// 触发获得金币事件GameEventsManager.instance.goldEvents.GoldGained(goldGained);StopAllCoroutines();StartCoroutine(RespawnAfterTime());}// 在一定时间后重生金币private IEnumerator RespawnAfterTime(){yield return new WaitForSeconds(respawnTimeSeconds);circleCollider.enabled true;visual.enabled true;}// 触发进入触发器事件private void OnTriggerEnter2D(Collider2D otherCollider) {if (otherCollider.CompareTag(Player)){CollectCoin();}}
}金币挂载脚本 运行效果 拾取金币后currentGold加1说明没问题
2. 显示金币数UI 一直查看金币变量数据变化不是很方便我们可以让金币数显示出来 修改GoldEvents新增金币变化事件
public class GoldEvents
{//。。。public event Actionint onGoldChange; // 当金币数量变化时触发的事件public void GoldChange(int gold) {onGoldChange?.Invoke(gold); // 触发金币变化事件}
}新增GoldUI注册金币数量发生变化时调用的方法
public class GoldUI : MonoBehaviour
{[Header(Components)]// 用于显示金币数量的TextMeshProUGUI组件[SerializeField] private TextMeshProUGUI goldText;// 在对象激活时注册事件监听器private void OnEnable() {// 当金币数量发生变化时注册GoldChange方法来处理事件GameEventsManager.instance.goldEvents.onGoldChange GoldChange;}// 在对象禁用时注销事件监听器private void OnDisable() {// 当对象被禁用时取消注册GoldChange方法GameEventsManager.instance.goldEvents.onGoldChange - GoldChange;}// 处理金币数量变化的事件private void GoldChange(int gold) {// 将金币数量转换为字符串并更新UI显示goldText.text gold.ToString();}
}同样配置GoldUI 脚本执行顺序
挂载脚本 修改GoldManager广播当前金币数量的改变事件
// 在第一帧更新之前调用广播当前金币数量的改变
private void Start()
{GameEventsManager.instance.goldEvents.GoldChange(currentGold);
}// 处理获得金币的事件
private void GoldGained(int gold)
{// 增加玩家的金币数量currentGold gold;// 广播金币数量的变化GameEventsManager.instance.goldEvents.GoldChange(currentGold);
}效果
完结
赠人玫瑰手有余香如果文章内容对你有所帮助请不要吝啬你的点赞评论和关注以便我第一时间收到反馈你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法也欢迎评论私信告诉我哦
好了我是向宇https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者出于兴趣爱好最近开始自学unity闲暇之余边学习边记录分享站在巨人的肩膀上通过学习前辈们的经验总是会给我很多帮助和启发php是工作unity是生活如果你遇到任何问题也欢迎你评论私信找我 虽然有些问题我也不一定会但是我会查阅各方资料争取给出最好的建议希望可以帮助更多想学编程的人共勉~