[开发者心得] 动态生成不靠谱锁链和环障碍物

[复制链接]
833 |1
脑的研发记录 发表于 2023-11-21 12:27:23 | 显示全部楼层 |阅读模式
本帖最后由 脑的研发记录 于 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)


贰.应用方向

场景反馈上:破坏墙,场景交互。悬挂物,射击娃娃机可还行,速度足够快,锁链穿模断?
装饰:塔尖上魔法缠绕的旋转环。旋转的地球仪可还行?
角色技能上:技能释放一堆圆环,套住对手。陷阱圈套。
玩法设计上:一个峡谷,方块和圆环掉落,玩家在空中踩着方块向上跳跃,同时向释放技能,用圆环限制对手行动,产生一堆圆环遮挡视线,阻碍玩家上升。以此把对手打入峡谷之下的虚空。



叁.其他小故事

场景破坏玩法和场景用于引导玩家行动的功能之间的矛盾的平衡
为什么很少有游戏支持场景破坏?是因为技术问题吗?



回复

使用道具 举报

复读机读复读机 发表于 2023-11-21 14:56:39 | 显示全部楼层
本帖最后由 复读机读复读机 于 2023-11-22 11:29 编辑

20231121145535_rec_.gif
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表