【简易实现】创建同类组内指定的对象实例
-
【提示】已有更好的方式实现,我研究这个方法的原因似乎是一个bug,不过该吐槽的还是少不了(
回复: [可以使用同类组创建指定的实例吗](/topic/2502/可以使用同类组创建指定的实例吗)
引用主题:https://bbs.evkworld.cn/topic/2502/
需求:很多对象,放在同类组里,现在需要创建其中指定的一个对象。
实现:
1.创建映射表,将对象名称与编号进行对照(可以用辞典实现,这一步有些时候可以省略)
2.为同类组添加实例变量,分别设置其中每个对象的初始变量值为其编号(这里的编号一定要与之前表格中的对应)
3.通过while循环执行动作组,通过动作组返回值来判断是否生成成功。
4.动作组写法:
创建实例 - 判断创建的实例编号是否与需要的编号相同(需要的编号通过映射表获取) - 如果不相同,则销毁并返回失败的值
5.【注意事项】如果需要在生成之后对角色做进一步处理,应该这样写;等待0秒不可省略,同时不能把后续的事件都放在此处,而必须单独用动作组或在其他地方完成。
一些想法和吐槽:
同类组这个功能在唤境里还挺神奇的,很多功能都可以用这玩意来实现,但是它实际上又不太灵活和好用。就像我这样的需求,就没有办法直接实现。
根据我的测试,任何方法生成的同类组都无法指定对象,而是直接生成其中随机一个对象的实例。所以,运气很差的话游戏就会卡很久才能加载出角色。同时,最大角色数量也因此受限,如果有数十个到数百个角色对象的话,加载时间就会进一步延长。
此外,唤境的教程也不是很完善,许多事件的执行逻辑和方式都是未知的。例如绝大多数动作是同步执行,但有些动作是异步执行的(典型例子是本地储存组件);所谓异步执行,即系统不受这个动作执行情况的影响,会继续执行它下面的其他动作,而无需等待它执行完成。但是实际上一些数组操作、表达式获取等可能都是异步的,这也就导致了某些情况下需要加“等待0秒”的动作,否则异步的动作还没有执行完成,就会影响下方部分动作和条件。
此外,唤境的对象和实例机制也不够灵活,例如不能按名称选中对象实例,缺乏“取消当前选中”的逻辑(这是因为有多个选中条件时,后一个条件的选中只能从前一个已经选中的实例中筛选,而不能重新从所有实例中选中,即使再使用“全选实例”也不行),以及更多。
不小心写多了,不过我确实希望唤境能提供更大一些的灵活性,从而节省编程时间、提高游戏运行效率。
-
..感觉不能这样写啊,同类组只用于同一类型的处理最好,创建具体的对象还是建议使用 【系统】->【通用】->【通过名称创建实例】来创建,在具体对象创建属性绑定需要创建的名称即可。
例如:有一个子弹同类组和飞机同类组,不同的飞机需要创建不同的子弹: 在飞机同类组添加 一个字段,对每个飞机对象设置其发射的子弹名,创建的时候使用通过名称创建实例 即可创建对应的子弹对象,然后 使用 选中最新创建的 子弹同类组 条件,即可对新创建的子弹进行赋值属性、设置方向等操作
-
@其余 我尝试过这样的写法,但是“通过名称创建对象”的动作创建出来的是对象的实例,而不是同类组的实例,后续选中同类组进行的操作都是失败的。可能是我当时的写法有问题,但是一次实验失败就让我完全放弃了这个想法。
-
@zjxdiu “根据名称创建实例”动作本身不像“创建实例”、“生成其他对象”动作会在执行后默认选中刚刚创建的实例,得在子事件位置结合系统组件条件中的“选中最新创建的实例”来选中,“选中最新创建的实例”这个条件本身的tips(小贴士)里也有说到这个
-
@牙白desune 在新场景里测试了一下,确实是可以的;但不知道为啥当时创建的时候就是不行,在预览界面的调试窗口里能看到,A对象的实例数量为1且能看到属性,但同类组则没有实例,可能只是一个bug吧,不过暂时就先这样了(刚好假装需要多加载一会