探索Unity游戏开发中的生命周期函数(四)

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

探索Unity游戏开发中的生命周期函数(四)
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 Unity 生命周期函数

为初学者节省宝贵的学习时间,避免困惑!

深入探索Unity游戏开发中的生命周期函数(一)
深入探索Unity游戏开发中的生命周期函数(二)
深入探索Unity游戏开发中的生命周期函数(三)
深入探索Unity游戏开发中的生命周期函数(四)

TechX 教程效果:

在这里插入图片描述



七、Gizmo Rendering

1、OnDrawGizmos


OnDrawGizmos是 Unity 生命周期中的一个函数,它用于在场景视图中绘制辅助图标以实现可视化。这些图标通常用于调试和编辑场景中的物体,以便更好地理解它们的属性、关系和行为。

以下是关于 OnDrawGizmos 函数的详细介绍:

  1. 函数签名:
void OnDrawGizmos()
  1. 调用时机:
  • OnDrawGizmos 函数在编辑器中绘制场景视图时被调用,而不会在实际的游戏运行时执行。这意味着它主要用于开发和调试阶段,以在编辑器中显示额外的信息。
  1. 可视化:
  • 你可以在 OnDrawGizmos函数中使用 Gizmos类的静态方法来绘制各种形状、线条和图标。这些绘制操作将在场景视图中可见,帮助你可视化游戏对象的某些属性或行为。
  1. 场景中所有物体:
  • 每个挂载了 OnDrawGizmos函数的脚本实例都会在编辑器中的场景视图中绘制图标,而不仅仅是选定的物体。这使得你可以同时查看多个物体的可视化信息。
  1. 编辑器性能:
  • 由于 OnDrawGizmos函数在编辑器中频繁调用,因此应当小心避免在函数内部执行耗时的操作。它主要用于简单的图标和辅助线条的绘制。

示例代码:

using UnityEngine;

public class GizmosExample : MonoBehaviour
{
    public float radius = 1.0f;
    public Color gizmoColor = Color.green;

    private void OnDrawGizmos()
    {
        // 设置 Gizmos 的颜色
        Gizmos.color = gizmoColor;

        // 在物体的位置绘制一个辅助图标
        Gizmos.DrawSphere(transform.position, radius);
    }
}

在这个示例中,我们创建了一个名为 GizmosExample的脚本,并将其挂载到一个游戏对象上。在 OnDrawGizmos 函数中,我们设置了 Gizmos 的颜色并使用 Gizmos.DrawSphere绘制了一个球形辅助图标。该图标将在场景视图中显示为绿色的球形。

总结:OnDrawGizmos函数在 Unity 编辑器中用于绘制辅助图标,以帮助开发者更好地理解游戏对象的属性和行为。这对于调试和编辑场景中的物体非常有用,但要注意在函数内部避免执行耗时的操作,以保持编辑器的性能。



八、GUI Rendering

1、OnGUI


OnGUI是用于处理用户界面(GUI)事件和绘制GUI元素。通过在 OnGUI函数中编写代码,你可以创建游戏的用户界面,包括按钮、文本、图像等元素,并且能够响应用户的交互。

以下是关于 OnGUI函数的详细介绍:

  1. 函数签名:
void OnGUI()
  1. 调用时机
  • OnGUI函数在每一帧中被调用,用于处理用户界面事件和绘制GUI元素。它主要用于游戏运行时和编辑器中的GUI绘制,因此它不适用于在非GUI方面执行的逻辑。
  1. GUI绘制:
  • 你可以在 OnGUI函数中使用GUILayout和GUI类的方法来创建GUI元素,如按钮、标签、文本框等。这些元素可以被放置在游戏窗口中的任何位置,以构建交互式的用户界面。
  1. 事件响应:
  • OnGUI函数也用于响应用户交互事件,如按钮点击、鼠标悬停等。你可以在函数中编写逻辑代码,根据用户的操作来触发不同的事件和行为。

示例代码:

using UnityEngine;

public class GUIExample : MonoBehaviour
{
    private int score = 0;

    private void OnGUI()
    {
        // 设置GUI绘制区域
        GUILayout.BeginArea(new Rect(10, 10, 150, 100));

        // 显示分数文本
        GUILayout.Label("Score: " + score);

        // 添加一个按钮,点击后分数加一
        if (GUILayout.Button("Increase Score"))
        {
            score++;
        }

        GUILayout.EndArea();
    }
}

在这个示例中,我们创建了一个名为 GUIExample的脚本,并将其挂载到一个游戏对象上。在 OnGUI函数中,我们使用 GUILayout类的方法创建了一个显示分数和一个按钮的GUI区域。当按钮被点击时,分数会增加。

总结:OnGUI函数是 Unity 中用于处理用户界面和交互事件的重要函数。通过在该函数中编写代码,你可以绘制GUI元素并响应用户操作,以实现游戏的用户界面和交互逻辑。注意,在 OnGUI函数中不应执行耗时的操作,以避免影响游戏性能。



九、Pausing

1、OnApplicationPause


OnApplicationPause是在应用程序暂停和恢复时执行特定的操作。当应用程序暂停或恢复时,Unity 会自动调用这个函数,允许你在应用程序状态变化时进行必要的处理。

以下是关于OnApplicationPause函数的详细介绍:

  1. 函数签名:
void OnApplicationPause(bool pauseStatus)
  1. 触发时机:
  • 当应用程序由活动状态切换到后台暂停状态(例如切换到其他应用、按下 Home 键、锁屏等)时,OnApplicationPause函数会被调用,参数 pauseStatus为 true。
  • 当应用程序从后台暂停状态切换回活动状态时,OnApplicationPause 函数同样会被调用,但参数 pauseStatus为 false。
  1. 使用场景:
  • OnApplicationPause函数常用于处理应用程序在暂停和恢复时的状态变化。你可以在这个函数中执行一些操作,如暂停游戏逻辑、保存游戏状态、处理后台音乐、关闭网络连接等。
  1. 注意事项:
  • OnApplicationPause在移动平台上的应用程序状态变化时非常有用,但在编辑器中测试时,由于编辑器没有与真实手机应用相同的生命周期,该函数可能不会按预期工作。
  • 对于某些平台和设备,可能会出现不同的行为,例如某些平台在锁屏后不会调用 OnApplicationPause函数。

下面是一个示例代码,展示了如何在应用程序暂停和恢复时处理游戏逻辑:

using UnityEngine;

public class PauseExample : MonoBehaviour
{
    private bool gamePaused = false;

    private void OnGUI()
    {
        GUILayout.BeginArea(new Rect(10, 10, 150, 100));

        if (GUILayout.Button("Toggle Pause"))
        {
            // 切换游戏暂停状态
            gamePaused = !gamePaused;

            if (gamePaused)
            {
                PauseGame();
            }
            else
            {
                ResumeGame();
            }
        }

        GUILayout.EndArea();
    }

    private void PauseGame()
    {
        Time.timeScale = 0f;
        Debug.Log("Game paused");
    }

    private void ResumeGame()
    {
        Time.timeScale = 1f;
        Debug.Log("Game resumed");
    }

    private void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus)
        {
            PauseGame();
        }
        else
        {
            ResumeGame();
        }
    }
}

在这个示例中,通过点击 “Toggle Pause” 按钮,你可以切换游戏的暂停状态。在应用程序暂停和恢复时,OnApplicationPause函数会相应地调用 PauseGame或 ResumeGame`函数,从而控制游戏的暂停和恢复。注意这个示例是基于 Unity 编辑器运行的,实际在移动设备上的表现可能会有所不同。



十、Disable

1、OnDisable


OnDisable是在游戏对象或脚本实例变为不可用或未激活状态时被调用。当你需要在禁用对象时执行一些清理操作或释放资源时,可以使用 OnDisable函数。

以下是关于 OnDisable函数的详细介绍:

  1. 函数签名:
void OnDisable()
  1. 调用时机: 当游戏对象或脚本实例由激活状态切换到非激活状态(禁用状态)时,OnDisable函数会被调用。这可能发生在以下情况:
  • 游戏对象被销毁时,其上的脚本会被禁用并调用 OnDisable函数。
  • 脚本所在的游戏对象被设置为非激活状态时,该脚本会被禁用并调用 OnDisable函数。
  1. 使用场景:OnDisable函数适用于需要在游戏对象变为非激活状态时执行清理操作的情况:
  • 需要释放分配的资源、取消注册事件监听器、保存状态等。
  • OnDisable也可用于优化性能,停止不需要在非激活状态时执行的操作,从而减少不必要的计算。
  1. 注意事项:
  • 与OnEnable函数相对应,OnDisable函数在相同的对象生命周期中调用。
  • 在 OnDisable 函数中执行的操作应该是可逆的,因为对象可能会在未来重新激活。
  • OnDisable函数不会只调用一次,它只会在对象从激活状态切换到非激活状态时调用。

下面是一个示例代码,展示了如何在 OnDisable函数中执行资源释放操作:

using UnityEngine;

public class ResourceReleaseExample : MonoBehaviour
{
    private GameObject heavyResource;

    private void Start()
    {
        // 在 Start 中加载资源
        heavyResource = Instantiate(Resources.Load<GameObject>("HeavyResource"));
    }

    // 当游戏对象被禁用时释放资源
    private void OnDisable()
    {
        if (heavyResource != null)
        {
            Destroy(heavyResource);
            Debug.Log("Resource released in OnDisable");
        }
    }
}

在这个示例中,当游戏对象被禁用时(例如,场景中的该对象被禁用或销毁),OnDisable 函数会被调用,并释放之前加载的资源。这有助于避免资源的浪费和内存泄漏。



十一、Decommissioning

1、OnDestroy


OnDestroy是在游戏对象被销毁时被调用。OnDestroy 函数提供了一个机会,让你在游戏对象即将被销毁时执行一些清理操作,释放资源,取消事件订阅等。

以下是关于 OnDestroy 函数的详细介绍:

  1. 函数签名:
void OnDestroy()
  1. 调用时机:当游戏对象被销毁时,OnDestroy函数会被调用。这可能发生在以下情况:
  • 显式调用 Destroy函数销毁对象。
  • 场景切换时,当前场景中的游戏对象将被销毁。
  • 程序退出时,所有游戏对象将被销毁。
  1. 使用场景:OnDestroy函数适用于需要在游戏对象被销毁前执行一些清理操作的情况:
  • 释放分配的资源、取消注册的事件监听器、保存数据等。
  • 执行与对象销毁相关的最终性操作,比如记录日志或发送分析数据。
  1. 注意事项:
  • OnDestroy函数是在游戏对象即将被销毁时被调用的,因此在这里执行的操作应该是最终性的,不会再需要该对象的引用。
  • OnDestroy函数只会被调用一次,并且在对象生命周期的末尾被调用。

下面是一个示例代码,展示了如何在 OnDestroy函数中释放资源和保存数据:

using UnityEngine;

public class CleanupExample : MonoBehaviour
{
    private GameObject dataToSave;

    private void Start()
    {
        // 在 Start 中加载需要保存的数据
        dataToSave = Instantiate(Resources.Load<GameObject>("DataToSave"));
    }

    // 当游戏对象被销毁时释放资源和保存数据
    private void OnDestroy()
    {
        if (dataToSave != null)
        {
            SaveData();
            Destroy(dataToSave);
            Debug.Log("Data saved and resource released in OnDestroy");
        }
    }

    private void SaveData()
    {
        // 在这里执行保存数据的操作
        Debug.Log("Data saved");
    }
}

在这个示例中,当游戏对象被销毁时,OnDestroy函数会被调用,其中资源会被释放,同时也会执行数据保存操作。这样可以确保在销毁对象之前进行资源清理和数据保存。


2、OnApplicationQuit


OnApplicationQuit是在应用程序即将退出时被调用。这个函数提供了一个机会,让你在应用程序退出之前执行一些清理操作、保存数据或执行最终性任务。

以下是关于 OnApplicationQuit函数的详细介绍:

  1. 函数签名:
void OnApplicationQuit()
  1. 调用时机:
  • 当应用程序即将退出时,无论是通过用户关闭窗口、按下退出按钮、还是通过其他方式,OnApplicationQuit函数都会被调用。它在应用程序结束之前最后被调用,可以用于在应用程序关闭前执行一些操作。
  1. 使用场景:OnApplicationQuit函数适用于需要在应用程序退出前执行一些清理操作的情况:
  • 保存尚未保存的数据、释放资源、断开网络连接、关闭日志等。
  • 行应用程序关闭时的最终性操作,确保应用程序在退出前处于合适的状态。
  1. 注意事项:
  • OnApplicationQuit 函数只在应用程序即将退出时被调用一次。因此,你可以在这里执行一些不需要被重复调用的操作。
  • 虽然 OnApplicationQuit可以用于保存数据,但是不建议在这里执行太耗时的操作,因为它会阻塞应用程序关闭的进程,导致用户体验不佳。
  • 需要注意的是,如果在 OnApplicationQuit中执行某些耗时操作,可能会影响应用程序关闭的速度。

下面是一个示例代码,展示了如何在 OnApplicationQuit函数中保存数据和关闭日志:

using UnityEngine;

public class QuitExample : MonoBehaviour
{
    // 在应用程序退出前保存数据和关闭日志
    private void OnApplicationQuit()
    {
        SaveData();
        CloseLogs();
        Debug.Log("Application is quitting");
    }

    private void SaveData()
    {
        // 在这里执行保存数据的操作
        Debug.Log("Data saved");
    }

    private void CloseLogs()
    {
        // 在这里执行关闭日志的操作
        Debug.Log("Logs closed");
    }
}

在这个示例中,OnApplicationQuit`函数被用于在应用程序退出前保存数据和关闭日志。这样可以确保在应用程序关闭时,相关的数据被保存,日志被关闭。





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐沐森的故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值