实时模板可以有效增加开发效率

模板存放位置:
C:\Users\user\AppData\Roaming\JetBrains\Rider\resharper-host\GlobalSettingsStorage.DotSettings

记录自己编写的几个实时模板

/// <summary>
/// Awake 函数会在游戏对象被实例化之后立即调用,而且在所有对象的 Start 函数调用之前执行。一般在 Awake 函数里进行以下操作:
/// <para>1. 初始化引用:查找并存储对其他组件或者游戏对象的引用,确保后续代码能够方便地访问这些对象。</para>
/// <para>2. 初始化设置:对脚本中的变量进行初始赋值。</para>
/// <para>3. 建立连接:比如和数据库或者网络服务建立连接。</para>
/// </summary>
private void Awake()
{
    $END$
}
/// <summary>
/// OnEnable 函数会在对象被启用时调用。函数在对象的生命周期中可能会被多次调用,只要对象被启用一次,它就会执行一次;而 Awake 只在对象实例化后调用一次,Start 只在第一帧更新前调用一次。
/// <para>1. 注册事件:当你需要在对象启用时注册一些事件监听器,就可以在 OnEnable 函数中完成。这样在对象被启用后,就能及时响应相应的事件。</para>
/// <para>2. 资源重置:如果对象在禁用时某些状态或者资源被改变,在启用时需要将其重置为初始状态,就可以在 OnEnable 里实现。</para>
/// <para>3. 初始化临时数据:对于一些只在对象启用期间有效的临时数据,可以在 OnEnable 中进行初始化。</para>
/// </summary>
private void OnEnable()
{
    $END$
}
/// <summary>
/// Start 函数会在脚本实例被启用时调用,并且只在第一帧更新之前执行一次。它一般用于:
/// <para>1. 依赖初始化:当某些初始化操作依赖于其他对象的 Awake 函数完成时,可以在 Start 函数里进行。</para>
/// <para>2. 数据加载:从文件或者服务器加载数据。</para>
/// </summary>
private void Start()
{
    $END$
}
/// <summary>
/// OnDestroy 函数会在以下几种情况下被调用:
/// <para>1. 当你使用 GameObject.Destroy 方法明确销毁一个游戏对象时,OnDestroy 会在销毁操作执行前被调用。</para>
/// <para>2. 当场景切换时,如果某个游戏对象没有设置为 DontDestroyOnLoad,那么在场景切换过程中该对象被销毁时,OnDestroy 也会被触发。</para>
/// <para>3. 当游戏结束或应用程序关闭时,所有存在的游戏对象都会被销毁,此时也会调用它们各自的 OnDestroy 函数。</para>
/// OnDestroy 函数适用的场景:
/// <para>1. 资源释放:当游戏对象持有一些外部资源,如网络连接、文件句柄、数据库连接等,在对象销毁时需要确保这些资源被正确释放,避免资源泄漏。</para>
/// <para>2. 事件注销:如果在 OnEnable 或者其他地方注册了事件监听器,为了防止出现内存泄漏,需要在 OnDestroy 中注销这些事件监听器。</para>
/// <para>3. 数据保存:在对象销毁前,可能需要将对象的一些状态数据保存到文件或者服务器,以便后续恢复或分析。</para>
/// </summary>
private void OnDestroy()
{
    $END$
}
/// <summary>
/// 当游戏对象的 SetActive(false) 方法被调用,或者脚本组件的 enabled 属性被设置为 false 时,OnDisable 函数就会被触发执行。另外,当游戏对象被销毁时,在销毁之前也会先调用 OnDisable 函数。和 OnEnable 一样,OnDisable 在对象的生命周期中也可能会被多次调用,只要对象被禁用一次,该函数就会执行一次。
/// <para>1. 注销事件:如果在 OnEnable 里注册了事件监听器,为避免出现内存泄漏问题,就需要在 OnDisable 中注销这些事件监听器。</para>
/// <para>2. 保存数据:在对象被禁用时,可以将对象的状态或数据保存到文件、数据库或者其他持久化存储中。</para>
/// <para>3. 释放资源:若对象在启用期间占用了一些资源,像网络连接、文件句柄等,在禁用时需要释放这些资源。</para>
/// </summary>
private void OnDisable()
{
    $END$
}
/// <summary>
/// OnApplicationQuit 是一个特殊的事件函数,它会在应用程序即将退出时被调用。
/// <para>1. 当用户关闭游戏窗口时。</para>
/// <para>2. 在编辑器中停止播放模式时。</para>
/// <para>3. 在移动设备上,当应用程序被关闭时。</para>
/// OnApplicationQuit 函数适用的场景:
/// <para>1. 数据保存:在应用程序退出前,保存游戏的进度、玩家的设置或者其他重要数据,以便下次启动时可以恢复。</para>
/// <para>2. 资源释放:关闭所有打开的文件、网络连接或者释放其他占用的系统资源,防止数据丢失或资源泄漏。</para>
/// <para>3. 日志记录:记录应用程序退出时的相关信息,如当前游戏状态、玩家的操作等,方便后续分析。</para>
/// </summary>
private void OnApplicationQuit()
{
    $END$
}

一个完整的示例:

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private Rigidbody rb;
    private int score;

    // Awake函数在对象实例化后立即调用
    void Awake()
    {
        // 查找并存储对刚体组件的引用
        rb = GetComponent<Rigidbody>();
        if (rb == null)
        {
            Debug.LogError("未找到刚体组件!");
        }

        // 初始化变量
        score = 0;
        Debug.Log("Awake函数执行,刚体引用已获取,分数已初始化为0。");
    }

    // OnEnable函数在对象启用时调用
    void OnEnable()
    {
        // 注册事件监听器
        GameManager.OnScoreChanged += UpdateScore;
        Debug.Log("OnEnable函数执行,事件监听器已注册。");

        // 重置资源
        if (rb != null)
        {
            rb.velocity = Vector3.zero;
            Debug.Log("刚体速度已重置为零。");
        }
    }

    // Start函数在第一帧更新之前调用
    void Start()
    {
        // 可以在这里进行依赖于其他对象Awake函数的初始化操作
        if (rb != null)
        {
            rb.useGravity = true;
            Debug.Log("Start函数执行,刚体已启用重力。");
        }

        // 模拟从文件或服务器加载数据
        LoadData();
    }

    // 事件处理函数
    void UpdateScore(int newScore)
    {
        score = newScore;
        Debug.Log("分数已更新为: " + score);
    }

    void LoadData()
    {
        // 这里可以添加实际的数据加载逻辑
        Debug.Log("数据加载完成。");
    }

    // OnDisable函数在对象禁用时调用
    void OnDisable()
    {
        // 注销事件监听器
        GameManager.OnScoreChanged -= UpdateScore;
        Debug.Log("OnDisable函数执行,事件监听器已注销。");

        // 保存数据
        SaveData();
    }

    // OnDestroy函数在对象销毁时调用
    void OnDestroy()
    {
        // 释放资源,例如关闭网络连接等
        Debug.Log("OnDestroy函数执行,资源已释放。");

        // 再次确认注销事件监听器(虽然OnDisable中已经做了,但这里是双重保险)
        GameManager.OnScoreChanged -= UpdateScore;
    }

    void SaveData()
    {
        // 这里可以添加实际的数据保存逻辑
        Debug.Log("数据已保存。");
    }
}

// 模拟一个游戏管理类
public static class GameManager
{
    public static event System.Action<int> OnScoreChanged;

    public static void ChangeScore(int newScore)
    {
        if (OnScoreChanged != null)
        {
            OnScoreChanged(newScore);
        }
    }
}