探索 Unity 中的事件驱动编程:ScriptableObjects 与 UnityEvents

这篇具有很好参考价值的文章主要介绍了探索 Unity 中的事件驱动编程:ScriptableObjects 与 UnityEvents。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

探索 Unity 中的事件驱动编程:ScriptableObjects 与 UnityEvents

探索 Unity 中的事件驱动编程:ScriptableObjects 与 UnityEvents,unityc#教程,unity3d开发教学,游戏开发小结,unity,游戏引擎,c#文章来源地址https://www.toymoban.com/news/detail-838345.html

介绍:

Unity 为开发人员提供了多种工具,用于在其项目中实现事件驱动编程。这些工具包括 ScriptableObjects 和 UnityEvents,两者都有相似的用途,但提供独特的优势和用例。
在本文中,我们将探讨 ScriptableObjects 和 UnityEvents 之间的差异,并提供有关何时使用每种方法的指导。

探索 ScriptableObjects:

ScriptableObjects 是 Unity 中的资产,可以保存数据并可以在项目的不同部分之间轻松共享。它们提供了一种灵活且解耦的事件处理方法,允许更复杂的交互和更高的可重用性。
有关 ScriptableObjects 的更多信息,请检查:

执行:

假设您正在创建一个简单的游戏,玩家可以在其中收集硬币,并且您希望使用 SO 的事件驱动编程来处理不同游戏元素之间的交互。

1.定义您的活动:

让我们定义两个事件:一个是玩家收集硬币时的事件,另一个是玩家的健康状况发生变化时的事件。
using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(fileName = "CoinCollectedEvent", menuName = "Events/Coin Collected Event")]
public class CoinCollectedEvent : ScriptableObject
{
    public UnityEvent OnCoinCollected;

    public void TriggerEvent()
    {
        OnCoinCollected.Invoke();
    }
}

[CreateAssetMenu(fileName = "HealthChangedEvent", menuName = "Events/Health Changed Event")]
public class HealthChangedEvent : ScriptableObject
{
    public UnityEvent<int> OnHealthChanged;

    public void TriggerEvent(int newHealth)
    {
        OnHealthChanged.Invoke(newHealth);
    }
}

2. 创建事件监听器:

创建将响应这些事件的事件侦听器组件。
using UnityEngine;

public class CoinCollectedListener : MonoBehaviour
{
    public CoinCollectedEvent coinCollectedEvent;

    private void OnEnable()
    {
        coinCollectedEvent.OnCoinCollected.AddListener(RespondToCoinCollected);
    }

    private void OnDisable()
    {
        coinCollectedEvent.OnCoinCollected.RemoveListener(RespondToCoinCollected);
    }

    private void RespondToCoinCollected()
    {
        Debug.Log("Coin collected!");
        // Increase player's score, update UI, etc.
    }
}

public class HealthChangedListener : MonoBehaviour
{
    public HealthChangedEvent healthChangedEvent;

    private void OnEnable()
    {
        healthChangedEvent.OnHealthChanged.AddListener(RespondToHealthChanged);
    }

    private void OnDisable()
    {
        healthChangedEvent.OnHealthChanged.RemoveListener(RespondToHealthChanged);
    }

    private void RespondToHealthChanged(int newHealth)
    {
        Debug.Log("Health changed to: " + newHealth);
        // Update UI, check for game over conditions, etc.
    }
}

3. 触发事件:

现在,让我们创建将触发这些事件的组件。
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public CoinCollectedEvent coinCollectedEvent;
    public HealthChangedEvent healthChangedEvent;

    private int health = 100;
    private int score = 0;

    // Called when the player collects a coin
    public void CollectCoin()
    {
        score += 10;
        coinCollectedEvent.TriggerEvent();
    }

    // Called when the player's health changes
    public void ChangeHealth(int amount)
    {
        health += amount;
        healthChangedEvent.TriggerEvent(health);
    }
}

4. 使用 ScriptableObjects :

将事件实例创建为 ScriptableObjects 并在 Unity 编辑器中配置它们。

5. 连接事件和监听器:

在 Unity 编辑器中将适当的事件和侦听器组件相互分配。
现在,每当玩家收集硬币或他们的健康状况发生变化时,就会触发相应的事件,并且任何监听这些事件的组件都会做出相应的响应。这种设置使您的游戏逻辑保持解耦和灵活。

Unity活动:

让我们回顾一下前面的简单游戏示例,其中玩家收集金币及其生命值变化,但这次使用 UnityEvents 而不是 ScriptableObjects。

1.定义您的活动:

在这种情况下,我们将直接在将使用 UnityEvent 变量的组件中定义它们。
using UnityEngine;
using UnityEngine.Events;

public class PlayerController : MonoBehaviour
{
    // Define UnityEvents for coin collected and health changed
    public UnityEvent onCoinCollected;
    public UnityEvent<int> onHealthChanged;  

    private int health = 100;
    private int score = 0;

    // Called when the player collects a coin
    public void CollectCoin()
    {
        score += 10;
        onCoinCollected.Invoke(); // Invoke the coin collected event
    }

    // Called when the player's health changes
    public void ChangeHealth(int amount)
    {
        health += amount;
        onHealthChanged.Invoke(health); // Invoke the health changed event with the new health value
    }
}

2. 创建事件监听器:

创建将响应这些事件的事件侦听器组件。
using UnityEngine;

public class GameController : MonoBehaviour
{
    private void OnEnable()
    {
        // Subscribe to the coin collected event
        FindObjectOfType<PlayerController>().onCoinCollected.AddListener(RespondToCoinCollected);
        // Subscribe to the healthchanged event
        FindObjectOfType<PlayerController>().onHealthChanged.AddListener(RespondToHealthChanged);

    }

    private void OnDisable()
    {
        // Unsubscribe from the coin collected event
        FindObjectOfType<PlayerController>().onCoinCollected.RemoveListener(RespondToCoinCollected);
        // Unsubscribe to the healthchanged event
        FindObjectOfType<PlayerController>().onHealthChanged.RemoveListener(RespondToHealthChanged);

    }

    private void RespondToCoinCollected()
    {
        Debug.Log("Coin collected!");
        // Increase player's score, update UI, etc.
    }
    private void RespondToHealthChanged(int newHealth)
    {
        Debug.Log("Health changed to: " + newHealth);
        // Update UI, check for game over conditions, etc.
    }
}

3. 触发事件:

现在,每当玩家收集硬币或他们的健康状况发生变化时,就会触发相应的事件,并且任何监听这些事件的组件都会做出相应的响应。
using UnityEngine;

public class Coin : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            // Call the CollectCoin method of the PlayerController
            other.GetComponent<PlayerController>().CollectCoin();
            Destroy(gameObject); // Destroy the coin object
        }
    }
}

public class Enemy : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            // Call the ChangeHealth method of the PlayerController
            other.GetComponent<PlayerController>().ChangeHealth(-10); // Decrease health by 10
            Destroy(gameObject); // Destroy the enemy object
        }
    }
}
在此实现中,我们直接在 PlayerController 组件中使用 UnityEvents,并在单独的侦听器组件中侦听这些事件。
虽然这种方法减少了创建和管理 ScriptableObjects 等其他资产的需求,但它也将事件定义和事件侦听器紧密耦合在特定组件内。
根据项目的复杂性和规模,直接使用 UnityEvents 可能更适合组件之间更简单的交互和更紧密的耦合。
使用 ScriptableObjects (SO) 和 UnityEvents 都有各自的优点和用例。
使用 ScriptableObjects 和常规 UnityEvents 之间的主要区别之一。
对于 ScriptableObjects,您需要在要使用它们的每个脚本中显式引用它们。这可能会涉及更多的设置开销,因为您需要创建 ScriptableObject 的实例并在 Unity 编辑器中分配它们。
另一方面,使用常规 UnityEvents,您可以直接在脚本中创建和调用事件,而无需在 Unity 编辑器中单独引用它们。这可以使 UnityEvents 对于更简单的场景或当您不需要 ScriptableObjects 提供的解耦和灵活性级别时更加方便。

选择哪一个?

对于紧密耦合的组件之间的简单交互,UnityEvents 可能更合适,因为它们简单且具有直接绑定功能。
对于解耦、灵活性和可重用性很重要的更复杂的系统(例如为更大的项目实现强大的事件系统),ScriptableObjects 可能是更好的选择。
在许多情况下,您可能会发现这两种方法的组合是有益的,使用 UnityEvents 进行简单的组件内通信,使用 ScriptableObjects 进行更复杂的组件间交互。

最终,选择取决于游戏项目的具体要求和架构。

到了这里,关于探索 Unity 中的事件驱动编程:ScriptableObjects 与 UnityEvents的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 事件驱动架构中的智能区块链架构设计与应用

    作者:禅与计算机程序设计艺术 在企业级分布式系统中,区块链技术逐渐成为一种热门话题。其优越性主要体现在解决分布式系统数据不一致、防篡改、匿名、快速响应等诸多方面,被广泛应用于各种金融、政务、身份、商业等领域。同时,区块链作为分布式系统的基础设施

    2024年02月13日
    浏览(37)
  • Unity中的DidReloadScripts事件:深入解析与实践

    在Unity开发过程中,我们经常需要在脚本重新编译后执行一些操作,例如刷新数据、重置状态等。这时,我们可以使用 DidReloadScripts 事件来实现这一需求。本文将详细介绍 DidReloadScripts 事件的用法,并通过三个实际案例来展示其应用场景。 DidReloadScripts 是Unity引擎提供的一种事

    2024年02月10日
    浏览(58)
  • AI驱动的大数据创新:探索软件开发中的机会和挑战

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容: 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 随着人工智能(AI)和大数据技术的迅速发展,软件开发领域正

    2024年02月11日
    浏览(49)
  • 探索C语言结构体:编程中的利器与艺术

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 在C语言中本身就自带了一些数据类型,如:char,int,float,double等数据类型都被称为 内置类型 ,但是在实际生活中我们发现这些基本的数据类型是不够用

    2024年02月19日
    浏览(46)
  • 模拟实现.net中的Task机制:探索异步编程的奥秘

    .net中使用Task可以方便地编写异步程序,为了更好地理解Task及其调度机制,接下来模拟Task的实现,目的是搞清楚: Task是什么 Task是如何被调度的 从最基本的Task用法开始 这个命令的作用是将action作为一项任务提交给调度器,调度器会安排空闲线程来处理。 我们使用Job来模拟

    2024年02月06日
    浏览(38)
  • 探索 JavaScript ES8 中的函数式编程并通过实例加以实践

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 函数式编程是一种强大的范式,强调使用纯函数和不可变数据。在本文中,我们将通过实际示例探讨如何

    2024年02月22日
    浏览(46)
  • Unity中的声音(声音开关+动画事件播放声音+控制声音大小UI)

            声音组件(一个scene中只能有一个Audio Listener,位于Camera)         Audio Source 理解为 “嘴巴” Unity中支持的音频格式 效果 :点击背景音乐暂停,再点击音乐继续。 步骤 (1)创建UI—Toggle(切换) 与图片上对应:       Label 文字       Background 白色框框    

    2024年02月10日
    浏览(42)
  • 了解ET模式和LT模式:Linux网络编程中的事件触发方式

    当谈到Linux网络编程中的ET(边缘触发)模式和LT(水平触发)模式时,我们需要理解它们在事件驱动编程中的作用和区别。下面是一篇详细解释这两种模式的博文,包含代码示例。 摘要: 在Linux网络编程中,ET(边缘触发)模式和LT(水平触发)模式是两种常用的事件触发方式

    2024年02月11日
    浏览(39)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(87)
  • 笔记_Unity中的C#编程_112-116

    Microsoft新一代多语言的开发平台,用于构建和运行应用程序 Microsoft 专为.NET推出的高级语言 ##Mono NOvell公司支持在其他操作系统下开发.NET程序的框架 Unity借助Mono实现跨平台,核心是.NET Framework 框架 脚本 是附加在游戏物体上用于定义游戏对象行为的指令代码,就是.cs的文本文

    2023年04月20日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包