添加修改屏幕分辨率的选项
Adventure Creator内置了对音量和字幕开关等基本选项的支持。然而,在为PC和Mac构建游戏时,可能需要添加更多选项,尤其是图形选项。
在这个高级教程中,我们将添加更改屏幕分辨率的功能,在游戏中作为一个自定义选项。我们将使用菜单、变量以及一些脚本。脚本编写将是非常基本的,但仍建议您事先掌握编码原则的基本知识,尽管完整的脚本仍全部展示出来。
可能的分辨率取决于用户的显示器。Unity在其Screen.resolutions中存储了可用选项的数组。
我们将使用一个整型变量来存储上述数组的当前索引。这将是一个全局变量,因此可以随时访问。
创建Global Variable首先转到Variables Manager,并添加一个新的Global Variable。
命名为ScreenResolution,Type设置为Integer,Initial Value为-1。如果发现它为负值,我们可以稍后编写脚本将其设置为正确的值。最后将Link to设置为Options Data。这将使其值在应用程序重新启动后仍然有效,并与保存的游戏文件分开。
记下变量的ID号,因为我们在编写脚本时需 ...
自定义Action-ActionListParameter
可以扩展Action以使用ActionList参数,以便在运行时设置字段值。在本教程中,我们将为自定义Action提供接受GameObject参数代替GUI中的字段的能力。
参数涉及使用Lists,这意味着我们必须首先引入一个新库。在脚本的标题中,添加以下内容:
1using System.Collections.Generic;
我们将参数存储为ID号,这与记录Constant ID的方式非常相似。但是,我们必须确保默认情况下将其设置为-1。添加到声明变量列表:
1public int parameterID = -1;
必须修改ShowGUI函数的重载以接受参数列表。
1override public void ShowGUI (List<ActionParameter> parameters)
然后,我们将调用一个函数,该函数将显示参数选择器(如果有)。如果选择其中一个,我们将重置其他变量-否则,我们将正常显示GUI:
12345678910111213141516171819public override void ShowGUI (List<Actio ...
自定义Action-Constant ID
在上一教程中,我们创建了一个自定义Action,该Action会影响场景中任何刚体的重力设置。但是,它只适用于“编辑”模式下场景中存在的对象:它不适用于在游戏中实例化的prefab,也不适用于“ActionList”资源文件。我们现在将通过使用Constant ID来解决此问题。
Constant ID是Adventure Creator在场景之间跟踪游戏对象的方式。当Constant ID脚本附加到GameObject或Prefab时,它给自己分配了一个Constant ID号,我们可以将其合并到Action中。这将允许我们的Action在涉及资产文件时发挥作用。
当作为Assets的ActionList引用Scene中的对象时,就会自动给Scene内的对象附加Constant ID。因为Asset里面的ActionList绝大部分是为了在不同的场景中复用的,不同的场景引用不同的对象,有了Constant ID就能第一时间确定引用,但是我们的ActionGravity还不能支持这个功能,这就是这一节要添加的。
我们首先声明一个新的整数,将ID号记录下来:
123public Ga ...
自定义Action-ActionTemplate
Action是AC的核心。Action被设计用来执行特定的任务,ActionList中链接在一起的Actions可以在游戏中形成Cutscenes、Interactions和任何logic sequence。
虽然Adventure Creator包含50多个“官方”Action,但可以通过编写自定义Action进一步扩展工具包,当我们需要执行传统冒险范围之外的任务时,自定义Action非常有用。
在本教程中,我们将编写一个Action,可以对任何游戏对象的刚体组件启用或禁用重力。请注意,本教程不是脚本编写指南:只是关于编写AdventureCreator可以使用的自定义代码的教程。
Action Template每个Action都包含在它自己的脚本文件中。我们可以使用包含的模板文件作为基础,而不是从头开始编写新脚本。在Assets文件夹中,可以找到脚本ActionTemplate.cs,位于AdventureCreator/Scripts/ActionList中。
1234567891011121314151617181920212223242526272829 ...
捡枪实现
目前枪械系统的功能列表如下
开枪
底层系统层
表现层
填弹
底层系统层
表现层
换枪
底层系统层
表现层
捡枪
底层系统层
表现层
弹药补给
底层系统层
表现层
补给站补给
底层系统层
表现层
捡枪的功能实现图如下
IGunSystem需要支持枪械的数据能够缓存起来,这个缓存机制在未来还要支持切换枪的功能。
我们使用Queue(先入先出)来缓存枪械,不过只能单向切枪。数据结构的选取需要考虑数据是否不断变化和数据是否频繁查询。
修改IGunSystem1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071using FrameWorkDesign;using System.Collections.Generic;using System.Linq;namespace ShootingEditor2D{ ...
反应式编程
反应式编程的科普文章,翻译自https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
什么是反应式编程微软的“反应式编程”指的是“Rx = Observables + LINQ + Schedulers”,和其他的反应式编程的概念不太相同。
反应式编程用一句话总结就是:
反应式编程就是使用异步数据流进行编程
在某种程度上,这不是什么新鲜事。事件总线或典型的单击事件实际上是一个异步事件流,您可以观察(Observe)并执行一些操作。反应式是相同的想法。您可以创建任何数据流,而不仅仅是单击和悬停事件。流是廉价且无处不在的,任何东西都可以是流:变量、用户输入、属性、缓存、数据结构等。例如,假设您的推特提要(Feed)是一个数据流,其方式与点击事件相同。你可以监听这个流并做出相应的反应。
除此之外,您还可以使用一个函数工具箱来组合、创建和过滤这些流。这就是“功能性”魔法发挥作用的地方。流可以用作另一个流的输入。甚至可以将多个流用作另一个流的输入。您可以合并两个流。您可以过滤一个流,以获得另一个只包含您感兴趣的事件的流。您可以将数据值从一个 ...
填弹实现
我们看下枪械系统要做的功能列表
开枪
填弹
换枪
捡枪
弹药补给
补给站补给
以上的功能列表还可以进一步拆分为如下
开枪
底层系统层
表现层
填弹
底层系统层
表现层
换枪
底层系统层
表现层
捡枪
底层系统层
表现层
弹药补给
底层系统层
表现层
补给站补给
底层系统层
表现层
我们先看一下填弹的功能实现图
按键填弹实现我们先实现按下R键,发送ReloadCommand来填弹
我们在Command文件夹里新建ReloadCommand文件
1234567891011121314151617181920212223242526272829303132333435363738using FrameWorkDesign;namespace ShootingEditor2D{ public class ReloadCommand : AbstractCommand { protected override void OnExecute() { ...
Query与充血、贫血模型的关系
我们在贫血模型和充血模型以及最佳实践里面演示过它们具体的概念:
充血模型是当查询一个数据的时候,返回的数据不多不少刚好是想要的数据。
贫血模型是当查询一个数据的时候,返回的数据可能比想要得多,或者比想要得少。
我们看一下MaxBulletQuery
1234567891011121314151617181920using FrameWorkDesign;namespace ShootingEditor2D{ public class MaxBulletCountQuery : AbstractQuery<int> { private readonly string mGunName; public MaxBulletCountQuery(string gunName) { mGunName = gunName; } protected override int OnDo() { var ...
Architecture支持Query
在这一节我们正式将Query整合到架构里面
添加IQuery我们在FrameworkDesign——Framework文件夹内新建Query文件夹,并在其中新建IQuery文件
12345678910111213141516171819202122232425262728293031using FrameWorkDesign;namespace ShootingEditor2D{ //注意接口一定要用public修饰,否则会出现访问不一致的问题 public interface IQuery<TResult> : IBelongToArchitecture,ICanSetArchitecture,ICanGetModel,ICanGetSystem { TResult Do(); } public abstract class AbstractQuery<TResult> : IQuery<TResult> { private IArchitect ...
弹夹容量查询,引入Query
在这一节,我们需要实现在枪械信息上显示弹夹容量
直接在UIContorller上面添加一些代码
1234567891011121314151617181920212223242526272829303132333435using UnityEngine;using FrameWorkDesign;using System;namespace ShootingEditor2D{ public class UIController : MonoBehaviour,IController { //... private int m_MaxBulletCount;// private void Awake() { //... //查询 var mGunConfigModel = this.GetModel<IGunConfigModel>();// var mGunConfigItem = mGun ...