抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

ScriptableObject

平时开发存在的一些问题:

  • 一个场景内有多个相同组件使用相同数值的时候,这个组件也在内存中多了一份实例,浪费内存空间。

  • static或者[Serializable]修饰的变量,在程序退出后会还原。编辑器模式运行时,只能通过Copy Component Values来临时保存调整好的数值。

  • 项目之间、场景之间数据很难共享。

  • 在runtime下要改变某个GameObject上组件的数值,就一定要获取到这个GameObject实例,使项目耦合度成倍提高,最后变成蜘蛛网。

  • 场景中总会有一些空的GameObject用来保存和共享数据,这个GameObject基本不会参与太多的游戏逻辑,但为了保存和共享场景内的数据就不得不碍眼的在场景中出现,逼死强迫症,也不利于模块抽象。

  • 同样,要通过UGUI Button中的On Click事件调用一个GameObject上的方法,也只能获取到GameObject实例来调用,数量太多的话也变成了蜘蛛网。

使用ScriptableObject如何解决

一、背景滚动实现方法

  • 创建一个3d对象Quad,重命名为SimpleBackground,调整好大小(跟图片差不多大)

  • 新建一个材质,设置shader为Unlit/Textu

    image-20220525113508926

  • 将图片texture type设置为default,拖入材质。

    image-20220525114905000

  • 将材质拖进SimpleBackground,这样就做好了背景。

  • 通过实时更改材质中offset偏移值,来实现滚动效果

    image-20220525115257651

  • 滚动代码如下:将Start()改为每帧刷新的协程(模拟Update())

Material material;
[SerializeField] Vector2 scrollVelocity;//速度
void Awake()
{
material = GetComponent<Renderer>().material;
}
private IEnumerator Start()
{
while (GameManager.GameState != GameState.GameOver)
//游戏状态不为gameover可运行场景滚动
{
material.mainTextureOffset += scrollVelocity * Time.deltaTime;
yield return null;
}
}

二、Input System动作输入系统

slider.onValueChanged.AddListenerslider.onValueChanged.AddListener((float v) => {//v等价于slider.value AudioTuning.Instance.SetMasterVolume(v); }); AudioTuning:p...

通过对象名称(Find方法) GameObject.Find("name") 通过标签获取单个游戏对象(FindWithTag方法) GameObject.FindWithTag("Tag"); 通过标签获取多个游戏对象(FindGameObjectsWithTags方法) 通过类型获取单个游戏对象(FindObjectOfType方法) ...

参考项目:https://www.bilibili.com/video/BV15W411976h

新加的功能

1.怪物球自转

2.不同炮台只可在特定颜色,区域内建造。

unity的Axis设置,路径为Edit->Project setting->Input:

属性如下:

Name:==按键名==该键的名称,可以在脚本编程中直接引用他。比如:Input.GetButtonDown(“Jump”);

Descriptive Name:==【描述名】==在游戏的独立机构中的配置对话框中,当控制值为正时候所显示的名称。默认空白。