本帖最后由 脑的研发记录 于 2023-11-21 12:25 编辑
动态生成不靠谱锁链和环障碍物
所用编辑器版本0.27.0.0
目录总览:
零.开发背景与剑走偏锋
壹.实现代码
贰.应用方向
叁.其他小故事
零.开发背景与剑走偏锋
想起来夸下海口做机械臂,整了两个路线,一个是代码预制各个方块的位置,按钮一按,按预制的顺序生成机械臂位置,但是机械臂的动量犯难了,也还没来得及想象动量的运算代码的样子。另一个路线是根据现有的物理模拟,只要限制某些关节的活动位置,超出范围自动复位。其他的让引擎自动演算。
再推演,想用方块搓机械臂,需把方块粘在一起,然后粘这个物理模拟代码没找出来,粘也好像分析太麻烦。细想到此为止。过了一段时间,看到素材库有圆环,想到圆环也可以限制活动空间,环套环基本就行,于是马上开代码,动态生成圆环,打开物理模拟,动态生成一堆圆环,没套起来,动态生成一排圆环,没套起来,动态生成一排圆环,每次生成一个环,环旋转90度,然后试了两次,y方向旋转不行,改x方向旋转,可以。然后再用人物拖动锁链跑,跑了没多久,锁链断裂。寄了。
不服继续,断裂的锁链也能用。锁链可以穿模断裂,说明锁链不坚固,用来做不坚固的墙多少也行。于是拿一堆圆环在原地生成。调整生成速度。人不可以闯过圆环生成区,但是来点动量击散圆环,赶在圆环重新生成堵起来道路可以闯过。
改了改圆环的生成个数,可以改堵塞规模。
参数:9:30-12:22代码&文案
壹.实现代码
复制粘贴直接跑
class ooh {
n: Model;
id: string;
}
// 原理是借用物理模拟和穿模,使得锁链受到冲击断开。
@Component
export default class ModelExample extends Script {
//当脚本被实例后,会在第一帧更新前调用此函数
protected build: Array<ooh> = new Array(30);
// 10个挡一人
// 30个环挡四个人
// protected i: number = -1;
protected j: number = 0;
protected k: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected async onStart(): Promise<void> {
// 预加载,不用拖进把编号为“197538”的素材进入场景,也能自动生成这个素材
AssetUtil.asyncDownloadAsset("197538");
// AssetUtil.asyncDownloadAsset("152664");
// AssetUtil.asyncDownloadAsset("198924");
for (var j = 0; j < this.build.length; j++) {
this.build[j] = new ooh();
}
if (SystemUtil.isClient()) {
// InputUtil.onKeyDown(Keys.F1, () => {
// F1键 通知服务器执行事件
// mw.Event.dispatchToServer("Model");
// });
let timer = setInterval(() => {
mw.Event.dispatchToServer("Model");
}, 200)
}
if (SystemUtil.isServer()) {
mw.Event.addClientListener("Model", () => {
if (this.j < 30) {
let box = GameObject.spawn("197538", {
transform: new Transform(new Vector(500 + this.j * 100, 0, 0), new Rotation(this.j * 90, 0, 0), new Vector(1, 1.5, 2)),
// 沿着x轴方向生成,旋转90度,让环套环,产生锁链,放缩大小感觉作用不大,速度超过350,穿模断开
replicates: true
}) as Model;
this.build[this.j].n = box;
this.build[this.j].n.massEnabled = true;
this.build[this.j].n.mass = 100;
// 200太沉推不动
this.build[this.j].n.gravityEnabled = true;
this.build[this.j].n.friction = 0.1;
this.build[this.j].n.restitution = 1;
this.build[this.j].n.physicsEnabled = true;
}
this.j++;
// 注释下面这六行尝试锁链,但是由于物理检测性能平衡,速度超过350就会穿模,锁链断开
if (this.j > 30) {
// this.build[this.k].n.physicsEnabled = false;
// this.build[this.k].n.setCollision(PropertyStatus.Off, true);
// this.build[this.k].n.setVisibility(PropertyStatus.Off, true);
// this.build[this.k].n.localTransform.position.x = 500;
// this.build[this.k].n.localTransform.position.y = 0;
// this.build[this.k].n.localTransform.position.z = 100;
this.build[this.k].n.localTransform = new Transform(new Vector(500 + this.k * 100, 0, 100), new Rotation(0, 0, 0), new Vector(1, 1, 1));
this.build[this.k].n.localTransform = new Transform(new Vector(500 + this.k * 30, 0, 100), new Rotation(0, 0, 0), new Vector(1, 1, 1));
this.k++;
this.k = this.k % 30;
}
// let box = GameObject.spawn("197386", {
// transform: new Transform(new Vector(500, 0, 100), new Rotation(0, 0, 0), new Vector(1, 1, 1)),
// replicates: true
// }) as Model;
// // 控制质量
// box.massEnabled = true;
// // 设置质量
// box.mass = 200;
// // 使用质量
// box.gravityEnabled = true;
// // 设置摩擦力
// box.friction = 0.1;
// // 设置弹力
// box.restitution = 1;
// // 开启物理模拟
// box.physicsEnabled = true;
});
}
}
}
其他就没了。
零基础起步的话应该也能看懂?上面代码用到的东西都在下面链接里具体说明了
“数据结构课作业笔记”#008-数组-方块喷泉-循环队列预兆 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)
贰.应用方向
场景反馈上:破坏墙,场景交互。悬挂物,射击娃娃机可还行,速度足够快,锁链穿模断?
装饰:塔尖上魔法缠绕的旋转环。旋转的地球仪可还行?
角色技能上:技能释放一堆圆环,套住对手。陷阱圈套。
玩法设计上:一个峡谷,方块和圆环掉落,玩家在空中踩着方块向上跳跃,同时向释放技能,用圆环限制对手行动,产生一堆圆环遮挡视线,阻碍玩家上升。以此把对手打入峡谷之下的虚空。
叁.其他小故事
场景破坏玩法和场景用于引导玩家行动的功能之间的矛盾的平衡
为什么很少有游戏支持场景破坏?是因为技术问题吗?
|