文章目录
- 每篇一句
- 前言
- 开启
- 配置门的开启动画
- 代码调用,控制开启门动画
- 新增CollisionDetector 脚本,使用UnityEvent ,控制钥匙和门的绑定
- 多把钥匙控制多个门
- 一把钥匙控制多个门
- BUFF系统
- 扩展
- 参考
- 源码
- 完结
每篇一句
人总是害怕去追求自己最重要的梦想,因为他们觉得自己不配拥有,或者觉得自己没有能力去完成。
——保罗柯艾略《牧羊少年奇妙之路》
前言
当开发2D游戏时,钥匙门系统和buff系统是常见的游戏机制。当开发2D游戏时,钥匙门系统和buff系统是常见的游戏机制。如果让你开发一个钥匙门系统,你的想法可能是写个钥匙控制脚本,再写个门脚本控制开门,当人物触碰钥匙然后调用对应的门代码,打开对应的门,这样做无疑是没什么问题的,但是当要扩展一个钥匙打开多门,或者不同钥匙打开不同门的情况,系统的扩展性和可读性就会变得很差。而这里我分享一种方法,使用UnityEvent实现这些系统。
UnityEvent是Unity引擎提供的事件系统,它允许我们在游戏中定义和触发自定义事件,并与之相关联的回调函数。使用UnityEvent,我们可以轻松地创建灵活的、可扩展的钥匙门系统和buff系统,为游戏增添深度和变化。
首先,使用UnityEvent可以实现高度的可定制性。我们可以设计各种类型的事件,并创建相应的回调函数来响应这些事件。例如,在钥匙门系统中,我们可以创建一个UnityEvent来表示玩家获得了一把钥匙,然后将该事件与门的解锁方法关联起来。这样,只要玩家获得了钥匙,门就会自动解锁。通过这种方式,我们可以根据游戏需要定义任意数量的事件和回调,从而创建出独特而富有挑战性的游戏玩法。
其次,UnityEvent提供了良好的可扩展性。由于UnityEvent是基于委托的,我们可以方便地增加或删除事件的监听器。这使得我们能够轻松地扩展钥匙门系统和buff系统的功能。例如,在buff系统中,我们可以在玩家获得一个新的buff时,通过UnityEvent通知其他相关系统进行相应处理,如调整玩家属性、触发特效等。通过添加和移除事件监听器,我们可以根据游戏的需求动态修改系统的行为,使其更加灵活和可定制。
此外,使用UnityEvent还能提高项目的可维护性和可读性。通过将事件和回调函数封装在UnityEvent中,我们可以将相关逻辑集中在一起,使代码更加清晰易懂。同时,当需要修改或扩展系统时,我们只需关注UnityEvent的定义和调用,而不必修改大量散落在代码中的具体实现。这种解耦合的设计有助于减少bug的引入,并提高代码的可维护性。
总而言之,使用UnityEvent可以极大地简化钥匙门系统和buff系统的开发过程,使其更具灵活性、可扩展性和可读性。通过合理地利用UnityEvent,我们能够快速实现复杂的游戏机制,并为玩家带来丰富多样的游戏体验。接下来,让我们深入了解如何利用UnityEvent来构建出色的钥匙门系统和buff系统吧!
开启
配置门的开启动画
代码调用,控制开启门动画
using UnityEngine;
public class Door : MonoBehaviour
{
private Animator _animator;
private void Awake()
{
_animator = GetComponent<Animator>();
}
// 菜单选项,用于在编辑器中手动调用Open方法
[ContextMenu(itemName: "Open")]
public void Open()
{
_animator.SetTrigger("Open");
}
}
效果
新增CollisionDetector 脚本,使用UnityEvent ,控制钥匙和门的绑定
using UnityEngine;
using UnityEngine.Events;
public class CollisionDetector : MonoBehaviour
{
[SerializeField]
private string _colliderScript;
[SerializeField]
private UnityEvent _collisionEntered;
[SerializeField]
private UnityEvent _collisionExit;
// 当其他物体进入碰撞时调用的方法
private void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.GetComponent(_colliderScript))
{
_collisionEntered?.Invoke();
}
}
// 当其他物体离开碰撞时调用的方法
private void OnCollisionExit2D(Collision2D col)
{
if (col.gameObject.GetComponent(_colliderScript))
{
_collisionExit?.Invoke();
}
}
}
绘制门和钥匙
挂载代码
效果
多把钥匙控制多个门
新增代码,控制修改钥匙颜色,对应门颜色也跟着改
using System;
using System.Collections.Generic;
using UnityEngine;
public class ColorAligner : MonoBehaviour
{
[SerializeField]
private Color _color;
[SerializeField]
private List<SpriteRenderer> _renderersToAlign;
// 在编辑器中修改字段值时自动调用的方法
private void OnValidate()
{
// 遍历_renderersToAlign列表,并将每个SpriteRenderer的颜色设置为_color字段的值
_renderersToAlign.ForEach((SpriteRenderer sp) =>
{
sp.color = _color;
});
}
}
配置
效果
一把钥匙控制多个门
绘制场景
配置参数
效果
BUFF系统
都看到这里了,buff系统的实现就不用多说了吧,同理即可
比如
using UnityEngine;
public class Buff : MonoBehaviour
{
public void AddHealth()
{
Debug.Log("加血");
}
public void AddSpeed()
{
Debug.Log("加速");
}
//TODO: 其他BUff
}
拾取每个buff物品时,执行对应的效果方法即可,是不是很简单?
扩展
你还可以将他扩展用到其他功能上,比如陷阱,触发对话,打开宝箱等等
参考
【视频】https://www.youtube.com/watch?app=desktop&v=1IJmenD1HOk
源码
为了防止大家变懒,源码就不提供了,大家直接可以照着文章思路进行学习
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。点赞越多,更新越快哦!当然,如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~