Unity坦克案例疑难记录(一)

一、unity中的单例模式

复制代码
public class BasePanel <T> :MonoBehavior where T :class
{     
     private static T instance;
     public static T Instance =>instance;

    public void Awake()
     {
        instance=this as T;
      }

}
 public virtual void ShowMe()
    {
        this.gameObject.SetActive(true);
    }
    public virtual void HideMe()
    {
        this.gameObject.SetActive(false);
    }

c#一般的写法是写 private static T instance=new T ();

Unity中的c#如果继承自MonoBehavior,那么该类不能去new(),它的对象是通过将挂载对应游戏对象上创建的。

类型不确定 ,所以使用泛型。

在Awake()中初始化的原因是 我们的面板脚本 在场景上 ,肯定只会挂载一次。

那么我们可以在这个脚本的生命周期函数的Awake中 直接记录场景上 唯一的这个脚本。

二、unity中的按钮等UI的监听为什么写到Start()中

clickEvent和onValueChanged等 会在值发生变化的那一刻(每改变一帧)自动触发

事件驱动 (Slider/Button/ScrollRect 等 UI 组件)→ 在 Start 中绑定回调。

轮询驱动 (Input、Time、鼠标世界坐标等持续变化的外部状态)→ 在 Update 中每帧读取。

三、UI面板对象的激活和隐藏时机

需求:游戏一进入显示的是开始面板,要让设置面板不能一进来就显示。

复制代码
public class SettingPanel : BasePanel<SettingPanel>
{
    public CustomGUISlider sliderMusic;
    public CustomGUISlider sliderEffect;

    public CustomGUIButton btnClose;
    public CustomGUIToggle toggleMusic;
    public CustomGUIToggle toggleEffect;
    // Start is called before the first frame update
    void Start()
    {
       
        btnClose.clickEvent += () =>
        {
            HideMe();
        };
        HideMe();
    }

内在逻辑:场景中的面板对象需要默认为激活状态 (否则挂载的脚本无法执行 AwakeStart 和事件注册),但玩家进入游戏时不应该直接看到设置面板。

Awake 阶段:instance = this as T 完成所有"必须依赖对象激活"的初始化。

这一步获取了当前游戏对象上的脚本实例 ,并将其存储到静态字段 instance

在Start 阶段:注册事件监听,然后立即调用 HideMe() 使面板失活。

由于 Awake 已经执行完毕,单例实例已经存在,即使面板失活,SettingPanel.Instance 仍然指向正确的对象。

后续通过 BeginPanel 中的 SettingPanel.Instance.ShowMe() 可以重新激活面板。

简记:Awake()中要获取到依赖对象。

四、脚本是否继承MonoBehaviour的问题

MonoBehaviour 是 Unity 脚本的基类,它允许脚本挂载到游戏对象(GameObject)上 ,并拥有 Unity 的生命周期事件(如 AwakeStartUpdateOnEnable 等)和独有方法以及能在Inspector中查看公共字段和SerializeField的私有字段

不继承MonoBehaviour的是数据模型,全局管理器,工具类。

相关推荐
叶帆11 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君11 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子11 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
心前阳光11 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光11 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯11 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案11 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔12 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
玉夏12 天前
【Shader基础】UV 与纹理采样 Part1
unity·着色器·uv
zdr尽职尽责12 天前
Unity录像功能
学习·ui·unity·游戏引擎