THE INVENTORY SYSTEM'S V1.72 UPDATE
AC的Inventory 系统作为其v1.72.0更新的一部分进行了全面重构。本页既概述了它如何从API级别工作,也为希望将自定义脚本移植到新系统的开发人员提供了指南。
输入Inventory Manager的Inventory Item数据存储在InvItem类中。
在v1.72.0之前,每当玩家处理一个物品时,都会在运行时生成这个类的副本——无论是在他们自己的Inventory 中,还是在Crafting中,或是放在Container中。这意味着,在脚本中处理这个类时,对InvItem的实际来源存在歧义。此类InvItem类存储在Lists中,并通过外部函数进行修改。
新的Inventory 系统对此做了两个根本性的改变:
在运行时处理Inventory 时,原始InvItem类将被单独保留。而是创建一个引用InvItem的InvInstance类。这个新类有额外的属性来记录它所代表的Item的数量、选择模式(Use vs Give)等等。虽然原始的InvItem类仍然可以访问,但这意味着它的来源不再模棱两可。
每当记录物品列表时,无论是用于玩家的Inventory 、Craft ...
THE ACTION SYSTEM'S V1.73 UPDATE
AC的Action系统已更新为其v1.73.0更新的一部分。这些更改旨在使Actions更加灵活,减少文件大小,并提高性能。此页面为希望将custom Actions升级到新系统的开发人员提供了指南。
首先,Actions不再具有设置其分类数据(标题、类别等)的构造函数。相反,这些字段现在通过重写属性进行设置:
title字符串变量现在是一个Title字符串属性
categoryActionCategory枚举变量现在是一个CategoryActionClassegory enum属性
description字符串变量现在是Description字符串属性
例如,以下是Engine:Wait Action的分类数据以前是如何声明的:
1234567public ActionPause (){ this.isDisplayed = true; category = ActionCategory.Engine; title = "Wait"; description = "Waits a set time before continuing.&q ...
ActionList数据备份
由于Unity序列化scene内的ActionList数据的方式,如果在脚本编译错误的情况下启动Unity,则可能会导致在删除错误后,打开的场景中的ActionList数据丢失。
为了缓解这种情况,AC v1.75.4以后版本每10分钟自动备份一次ActionList数据。
在Unity 2019.2中,这可以在项目设置中配置,方法是转到Unity顶部工具栏中的编辑->项目设置..,然后从列表中选择Adventure Creator:
可以通过Autosave interval(m)字段设置备份ActionList数据的频率:
要禁用自动保存,请将其设置为零。
如果数据丢失,可以按ActionList恢复备份的数据。要还原ActionList的数据,请单击ActionList组件右上角的图标,然后从菜单中选择Action data->restore:
架构演化梳理
课程的最开始,是没有用任何架构就做一个《点点点》这样的项目,做的方式就是用拖拽加一点代码的方式。
但是这种方式有一个问题,就是对象之间的相互访问没有规则也没有限制,在项目规模变大时就一定会混乱。
于是引入了一个规则,只有自顶向下的时候可以直接访问对象或者调用对象的方法。自底向上的时候使用事件或者委托。而在讲这个规则之前还介绍了对象之间的三种交互方式:方法调用、委托、事件。
然后自底向上和自顶向下再向上对象之间的三种交互方式构成了一个大的前提,后边比如层级、业务模块等只要有高低之分的我们就都用这套规则去约束了。
再往下就介绍了一个简单的模块化,介绍了一个单例的模块化。我们在设计的时候经常听到一个原则,就是高内聚低耦合,高内聚的意思就是相同的代码放在一个地方去管理,低耦合就是对象之间的引用不要太多,最好就是单项引用或者没有引用,或者是有一定的规则去约束如何互相访问的。
再往下就引入了一个概念,就是Model。Model是为什么引入的呢?是因为有一些数据,需要在多个地方去共享,比如角色的攻击力,需要在UI界面上显示,或者计算一个伤害的时候需要使用,以及存储这个攻击力也是一种共享方式。这一类数 ...
表现层父类实现和枪械系统总结
目前枪械系统的功能列表如下
开枪
底层系统层
表现层
填弹
底层系统层
表现层
换枪
底层系统层
表现层
捡枪
底层系统层
表现层
弹药补给
底层系统层
表现层
补给站补给
底层系统层
表现层
所有的底层系统层都完成了。
实现表现层父类在这一节,我们改进一下架构的用法。
我们的表现层都会继承IController,实现这个接口时都要自主实现一遍返回框架入口的方法
1234public IArchitecture GetArchitecture(){ return ShootingEditor2D.Interface;}
显然这是重复的工作,在这里我们实现一个表现层父类
直接在ViewController文件夹内部新建一个ShootingEditor2DController文件
12345678910111213using UnityEngine;using FrameWorkDesign;namespace ShootingEditor2D{ public abstract cl ...
弹药和补给站实现
弹药补给弹药补给功能实现图
修改IGunSystem由于所有的枪都要增加一个弹夹的子弹,所以我们需要获取IGunSystem中的mGunInfos,需要将此队列开放出来
1234567891011121314151617181920212223242526272829303132333435using FrameWorkDesign;using System.Collections.Generic;using System.Linq;namespace ShootingEditor2D{ interface IGunSystem : ISystem { //... Queue<GunInfo> GunInfos { get; } } public class OnCurrrentGunChanged { public string Name { get; set; } } public class G ...
换枪实现
目前枪械系统的功能列表如下
开枪
底层系统层
表现层
填弹
底层系统层
表现层
换枪
底层系统层
表现层
捡枪
底层系统层
表现层
弹药补给
底层系统层
表现层
补给站补给
底层系统层
表现层
功能实现图如下
由于我们已经实现了捡枪的操作,所以换枪系统就比较简单了
修改IGunSystem直接修改IGunSystem
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384using FrameWorkDesign;using System.Collections.Generic;using System.Linq;namespace ShootingEditor2D{ interface IGunSystem : ISystem { ...
保存自定义Global数据
每当AdventureCreator保存和加载游戏时,它都会检查是否存在某些“脚本挂钩”,如果存在则调用它们。这些钩子可以用来保存和加载游戏可能需要的自定义数据。请注意,这是一个高级主题,因此需要了解脚本接口!
虽然保存场景数据是一个单独的过程,但这些挂钩用于全局数据,这些数据存在于场景之外,例如资产文件中。在本教程中,我们将创建一个简单的示例,其中包含保存人名。
在我们的保存游戏文件中,这个名称将临时存储为一个全局变量,所以第一步是创建一个可以被我们的钩子使用的变量。由于名称是字符串,我们将创建字符串Variable。转到Variables Manager,然后单击创建新的Global variable。
将这个新变量的Label设置为SaveText,将Type设置为String。它的初始值与此无关,但请记下它的ID号。在本例中,它是3:
现在,让我们创建脚本挂钩。创建一个名为MyName的新C#脚本文件,并让它导入AC命名空间:
12345678using UnityEngine;using System.Collections;using AC;public class M ...
保存自定义场景数据
在Adventure Creator中保存场景对象的状态只需将正确的“Remember”脚本附加到其中即可。Adventure Creator提供了几个这样的脚本,每个脚本都保存不同类型的场景数据。例如,将RememberHotspot脚本附加到任何Hotspot将保存该热点的打开/关闭状态,以及其中每个Interaction的状态。
然而,在更复杂的游戏中,可能需要保存比标准Remember脚本允许的更多数据。幸运的是,可以编写可以附加到场景对象的自定义脚本来保存您想要的任何内容。
这将是一个相当复杂的教程,需要对脚本实践有很好的了解。在其中,我们将编写一个新的Remember脚本,用于保存附加到的任何灯光组件的打开/关闭状态。
创建一个名为RememberLight的新C#脚本。使用AC namespace,并从Remember派生类。它还需要Light 组件:
12345678910111213using UnityEngine;using System.Collections;namespace AC{ [RequireComponent (typ ...
调用自定义Events
调用自定义事件是将新代码或第三方资产集成到Adventure Creator中的一种方便方法,因为它们可以在AC常规代码之外调用,而不是代替。Adventure Creator的EventManager脚本提供了许多事件处理程序,这些程序在AC.EventManager Class Reference中列出。
出于本教程的目的,我们将添加一个事件侦听器,该侦听器将在角色说话时被调用。例如,如果我们希望集成一个自定义的lip-syncing解决方案,这可能会很有用。由于本教程涵盖了脚本编写,因此假设您具备C#的基本知识。
EventManager脚本有一个名为OnStartSpeech的静态事件,每当角色开始说话时就会调用该事件。根据脚本编写指南,任何侦听器都需要以下参数:
AC.Char speakingCharacter - 正在说话的角色。如果为空,则该行被视为旁白
string speechText - 对话文本
int lineID- SpeechManager生成的speech line ID号
创建名为SpeechListener的新C#脚本,并在顶部添加AC name ...