Bug:构造期间不为 null 游戏开始后变成 null
一个最简单的使用 Switchable 的 Controller
Assets/MeowFramework/TPSCharacter/Scripts/Controller/TPSCharacterUIController.Mode.cs
// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 12/04/2022 15:53
// 最后一次修改于: 22/04/2022 20:50
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------
using System.Collections.Generic;
using MeowFramework.Core.Switchable;
using Sirenix.OdinInspector;
using UnityEngine;
namespace MeowFramework.TPSCharacter
{
/// <summary>
/// 第三人称 UI 控制器
/// </summary>
public partial class TPSCharacterUIController
{
/// <summary>
/// 行动模式
/// </summary>
[BoxGroup("Mode")]
[Tooltip("行动模式")]
public SwitcherEnum<TPSCharacterBehaviourMode> SwitcherMode = new SwitcherEnum<TPSCharacterBehaviourMode>();
/// <summary>
/// 瞄准 UI 的透明度
/// </summary>
[BoxGroup("Mode")]
[Tooltip("瞄准 UI 的透明度")]
public SwitchableFloat AimUIAlpha = new SwitchableFloat();
/// <summary>
/// 初始化可切换变量列表
/// </summary>
private void InitSwitchableList()
{
// Switcher 注册
SwitcherMode.Owner = this;
// Switchable 注册
SwitcherMode.RegisterSwitchable(new List<ISwitchable>{
AimUIAlpha,
});
// Switchable 数值绑定
AimUIAlpha.AfterValueChangeAction += (oldValue, newValue) => {
AimUI.GetComponent<CanvasGroup>().alpha = newValue; };
}
}
}
测试的时候发现 SwitcherMode.switchableObjectList == null
导致 InitSwitchableList()
中 switchableObjectList.AddRange(switchableList);
出错
我还以为是类嵌套类就会导致被嵌套的类的初始化发生错误
但是拿一个空项目试验了一下发现不是
测试代码 1
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
public class ClassA
{
public List<int> TestListA = new List<int>();
}
public class ClassB
{
public List<int> TestListB = new List<int>();
public ClassA InstanceA = new ClassA();
}
internal static class Program
{
public static void Main(string[] args)
{
ClassB instanceB = new ClassB();
Console.WriteLine(instanceB.InstanceA.TestListA == null);
Console.WriteLine(instanceB.TestListB == null);
}
}
}
换成泛型也不影响
测试代码 2
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
public class ClassA<T>
{
public List<int> TestListA = new List<int>();
}
public class ClassB
{
public List<int> TestListB = new List<int>();
public ClassA<int> InstanceA = new ClassA<int>();
}
internal static class Program
{
public static void Main(string[] args)
{
ClassB instanceB = new ClassB();
Console.WriteLine(instanceB.InstanceA.TestListA == null);
Console.WriteLine(instanceB.TestListB == null);
}
}
}
换成接口也不影响
测试代码 3
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
public interface ITestable
{
void TestFun();
}
public class ClassA<T>
{
public List<ITestable> TestListA = new List<ITestable>();
}
public class ClassB
{
public