Jelajahi Sumber

怪物AI修改

chelios 3 tahun lalu
induk
melakukan
df84806fc7
23 mengubah file dengan 976 tambahan dan 529 penghapusan
  1. 0 3
      assets/Script/game/fight/bullet/BObject.ts
  2. 62 93
      assets/Script/game/fight/object/AI/AIBase.ts
  3. 12 0
      assets/Script/game/fight/object/AI/behavior.meta
  4. 51 0
      assets/Script/game/fight/object/AI/behavior/BehaviorNode.ts
  5. 9 0
      assets/Script/game/fight/object/AI/behavior/BehaviorNode.ts.meta
  6. 73 0
      assets/Script/game/fight/object/AI/behavior/BehaviorTree.ts
  7. 9 0
      assets/Script/game/fight/object/AI/behavior/BehaviorTree.ts.meta
  8. 12 0
      assets/Script/game/fight/object/AI/behaviorNode.meta
  9. 23 0
      assets/Script/game/fight/object/AI/behaviorNode/BehaviorDead.ts
  10. 9 0
      assets/Script/game/fight/object/AI/behaviorNode/BehaviorDead.ts.meta
  11. 29 0
      assets/Script/game/fight/object/AI/behaviorNode/BehaviorHP.ts
  12. 9 0
      assets/Script/game/fight/object/AI/behaviorNode/BehaviorHP.ts.meta
  13. 31 0
      assets/Script/game/fight/object/AI/behaviorNode/BehaviorTarget.ts
  14. 9 0
      assets/Script/game/fight/object/AI/behaviorNode/BehaviorTarget.ts.meta
  15. 5 7
      assets/Script/game/fight/object/FSprite.ts
  16. 1 8
      assets/Script/game/fight/object/skill/SkillBase.ts
  17. 2 1
      assets/Script/game/fight/object/skill/SkillCharge.ts
  18. 4 1
      assets/Script/game/fight/object/skill/SkillFixed.ts
  19. 4 1
      assets/Script/game/fight/object/skill/SkillRotate.ts
  20. 4 1
      assets/Script/game/fight/object/skill/SkillShotgun.ts
  21. 1 1
      assets/resources/prefab/common/hp_monter_red.prefab
  22. 606 406
      assets/resources/prefab/map/map1.prefab
  23. 11 7
      local/local.json

+ 0 - 3
assets/Script/game/fight/bullet/BObject.ts

@@ -17,9 +17,6 @@ export default class BObject extends cc.Component {
     })
     speed: number = 2000;//子弹速度
 
-    @property({
-        displayName: '子弹射程'
-    })
     distance: number = 500;//子弹攻击距离
 
     @property({

+ 62 - 93
assets/Script/game/fight/object/AI/AIBase.ts

@@ -24,26 +24,11 @@ export default class AIBase extends cc.Component {
         displayName: '灵敏度(毫秒)'
     })
     public AI_CD:number = 1000;
-    /**
-     * 攻击间隔 ms
-     * 一次攻击后间隔多久开始下次攻击
-     */
-    @property({
-        displayName: '攻击间隔(毫秒)'
-    })
-    public atk_CD = 3000;
-    /**
-     * 每次攻击几颗子弹
-     */
-    @property({
-        displayName: '每次攻击子弹数量'
-    })
-    public atk_count = 1;
     /**
      * 移动速度
      */
     @property({
-        displayName: '移动速度'
+        displayName: '角色移动速度'
     })
     public speed = 50;
     /**
@@ -117,41 +102,43 @@ export default class AIBase extends cc.Component {
         if(!this.canSkill){
             return;
         }
-
-        let time = new Date().getTime();
         let target = this.checkTarget();
         if(target){
             if(this.skills.length > 0){
-                let skill = this.checkSkill(target);
+                let skill:SkillBase = this.checkSkill(target);
                 if(skill){
-                    // cc.log('开始使用技能 :',skill)
-                    this.canSkill = false;
-                    skill.exe(target,()=>{
-                        this.canSkill = true;
-                        // cc.log('技能使用结束 :',skill)
-                    });
-                }else{
-                    if(this.AI_Time == 0){
-                        this.AI_Time = time;
-                    }else if(time - this.AI_Time > this.AI_CD){
-                        this.AI_Time = time;
-                        this.walk(this.sprite.mButtleDis);
+                    if(this.speed <= 0){
+                        this.canSkill = false;
+                        skill.exe(target,()=>{
+                            this.canSkill = true;
+                            // cc.log('技能使用结束 :',skill)
+                        });
+                    }else{
+                        let p1 = this.sprite.node.getPosition()
+                        let p2 = target.node.getPosition()
+                        let dis = CMath.getDistance(p1,p2);
+                        if(dis < skill.range){
+                            this.canSkill = false;
+                            skill.exe(target,()=>{
+                                this.canSkill = true;
+                                // cc.log('技能使用结束 :',skill)
+                            });
+                        }else{
+                            this.walk(skill.range);
+                            // this.moveToTarget(target)
+                        }
                     }
                 }
-            } else{
-                if(time - this.atk_Time > this.atk_CD){
-                    this.atk_Time = time;
-                    this.fire(target);
-                }
-            }
-        }else{
-            if(this.AI_Time == 0){
-                this.AI_Time = time;
-            }else if(time - this.AI_Time > this.AI_CD){
-                this.AI_Time = time;
-                this.walk(this.sprite.mButtleDis);
             }
         }
+        // else{
+        //     if(this.AI_Time == 0){
+        //         this.AI_Time = time;
+        //     }else if(time - this.AI_Time > this.AI_CD){
+        //         this.AI_Time = time;
+        //         this.walk(0);
+        //     }
+        // }
     }
     /**
      * 查询可用技能
@@ -167,24 +154,27 @@ export default class AIBase extends cc.Component {
         if(lists.length <= 0){
             return null;
         }else{
-            let p1 = this.node.getPosition();
-            let p2 = target.node.getPosition();
-            let dis = cc.Vec2.distance(p1,p2);
-            let fList = [];
-            for (let i = 0; i < lists.length; i++) {
-                const element = lists[i];
-                if(dis < element.range){
-                    fList.push(element);
-                }
-            }
-            if(fList.length <= 0){
-                this.moveToTarget(target);
-                return null;
-            }else{
-                this.sprite.playAction(SpriteActionType.stand,true)
-                let index = CMath.getRandom(0,fList.length-1);
-                return fList[index];
-            }
+            let index = CMath.getRandom(0,lists.length-1);
+            return lists[index];
+
+            // let p1 = this.node.getPosition();
+            // let p2 = target.node.getPosition();
+            // let dis = cc.Vec2.distance(p1,p2);
+            // let fList = [];
+            // for (let i = 0; i < lists.length; i++) {
+            //     const element = lists[i];
+            //     if(dis < element.range){
+            //         fList.push(element);
+            //     }
+            // }
+            // if(fList.length <= 0){
+            //     this.moveToTarget(target);
+            //     return null;
+            // }else{
+            //     this.sprite.playAction(SpriteActionType.stand,true)
+            //     let index = CMath.getRandom(0,fList.length-1);
+            //     return fList[index];
+            // }
         }
     }
     /**
@@ -219,44 +209,25 @@ export default class AIBase extends cc.Component {
         this.sprite.setDir(tmp);
     }
 
-    public fire(target:FSprite){
-        //判断是否在攻击范围内
-        let mts = this.sprite.mButtleDis;
-        let p1 = target.node.getPosition();
-        let p2 = this.sprite.node.getPosition();
-        let dis = cc.Vec2.distance(p1,p2);
-
-        if(dis > mts){
-            this.moveToTarget(target);
-        }else{
-            this.sprite.setDir({x:0,y:0});
-            this.sprite.setShooting(true);
-            let count = 0;
-            this.canSkill = false;
-            this.sprite.setFireCallback(()=>{
-                count ++;
-                if(count >= this.atk_count){
-                    this.sprite.setShooting(false);
-                    this.sprite.setFireCallback(null);
-                    cc.tween(this).delay(0.7).call(()=>{
-                        this.walk(this.sprite.mButtleDis);
-                    }).start();
-                }
-            });
-        }
-    }
     /**
      * 远程怪物的闲逛
      */
     public walk(distance){
-        cc.tween(this).delay(0).call(()=>{
+        if(this.speed > 0){
+            this.canSkill = false;
             this.sprite.setDir(this.getRandState(distance));
             this.sprite.playAction(SpriteActionType.move,true)
-        }).delay(0.5).call(()=>{
+            cc.tween(this).delay(0.5).call(()=>{
+                this.sprite.setDir({x:0,y:0});
+                this.sprite.playAction(SpriteActionType.stand,true)
+            }).delay(1).call(()=>{
+                this.canSkill = true;
+            }).start()
+        }else{
             this.canSkill = true;
             this.sprite.setDir({x:0,y:0});
             this.sprite.playAction(SpriteActionType.stand,true)
-        }).start();
+        }
     }
 
     public getRandState(distance){
@@ -264,10 +235,8 @@ export default class AIBase extends cc.Component {
             let p1 = this.target.node.getPosition();
             let p2 = this.sprite.node.getPosition();
 
-            let distance = this.sprite.mButtleDis;
-
             let dis = CMath.getDistance(p1,p2);
-            if(dis > 150){
+            if(dis > distance){
                 let tmp = {
                     x:0,
                     y:0

+ 12 - 0
assets/Script/game/fight/object/AI/behavior.meta

@@ -0,0 +1,12 @@
+{
+  "ver": "1.1.2",
+  "uuid": "94a0cb13-19e4-46f2-938d-97d593c3149b",
+  "isBundle": false,
+  "bundleName": "",
+  "priority": 1,
+  "compressionType": {},
+  "optimizeHotUpdate": {},
+  "inlineSpriteFrames": {},
+  "isRemoteBundle": {},
+  "subMetas": {}
+}

+ 51 - 0
assets/Script/game/fight/object/AI/behavior/BehaviorNode.ts

@@ -0,0 +1,51 @@
+import BehaviorTree, { ExeResult } from "./BehaviorTree";
+
+/**
+ * 节点类型
+ */
+export const BehaviorNodeType = cc.Enum({
+    Root:0,//根节点
+    Sequence: 1,//顺序节点 将其所有子节点依次执行,当前一个返回“完成”状态后,再运行下一个子节点
+    Selector: 2,//选择节点
+    Parallel: 3,//并行节点 每个节点执行一次
+    Conditinals:4,//条件节点
+    Action: 5,//动作节点
+});
+
+/**
+ * 行为树节点
+ */
+export default class BehaviorNode{
+    public type = BehaviorNodeType.Root;
+    /**
+     * 行为树
+     */
+    public behaviorTree:BehaviorTree = null;
+    /**
+     * 子节点
+     */
+    public childNode:Array<BehaviorNode> = []
+
+    constructor(behaviorTree:BehaviorTree){
+        this.behaviorTree = behaviorTree;
+    }
+
+    public addNode(node:BehaviorNode){
+        this.childNode.push(node)
+    }
+    /**
+     * 
+     * @returns 当前节点是否返回
+     */
+    public isOK():boolean{
+        return false
+    }
+    /**
+     * 执行当前节点
+     * @param callback 执行结束后回调
+     * @returns 执行的节点
+     */
+    public run(callback:(behaviorNode)=>void){
+        callback(null)
+    }
+}

+ 9 - 0
assets/Script/game/fight/object/AI/behavior/BehaviorNode.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "d7caa739-9a7a-4c8a-9990-b2a76a3b0852",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 73 - 0
assets/Script/game/fight/object/AI/behavior/BehaviorTree.ts

@@ -0,0 +1,73 @@
+import FSprite from "../../FSprite";
+import BehaviorNode from "./BehaviorNode";
+/**
+ * 行为树
+ */
+const {ccclass, property} = cc._decorator;
+/**
+ * 执行结果
+ */
+export const ExeResult = cc.Enum({
+    Success: 0,
+    Failure: 1,
+    Running: 2,
+});
+
+
+@ccclass
+export default class BehaviorTree extends cc.Component {
+
+    public sprite:FSprite = null;//行为对象
+
+    public rootNode:BehaviorNode;
+    /**
+     * 当前执行状态
+     */
+    public state = ExeResult.Success;
+    /**
+     * update(dt) 中执行
+     * @returns 
+     */
+    public exec(){
+        if(this.state == ExeResult.Running){
+            return
+        }
+        this.state = ExeResult.Running
+        this.executing(this.rootNode)
+    }
+    /**
+     * 执行当前行为树
+     */
+    private executing(rootNode:BehaviorNode){
+        let behaviorNode:BehaviorNode = this.findNode(rootNode);
+        if(behaviorNode){
+            behaviorNode.run((nextNode)=>{
+                if(nextNode){
+                    this.executing(nextNode)
+                }else{
+                    this.state = ExeResult.Success;
+                }
+            })
+        }else{
+            this.state = ExeResult.Success;
+        }
+    }
+    /**
+     * 递归查询当前行为树中可执行节点
+     * @param node 
+     * @returns 
+     */
+    private findNode(node:BehaviorNode):BehaviorNode{
+        let nodes = node.childNode
+        for (let i = 0; i < nodes.length; i++) {
+            const element = nodes[i];
+            if(element.isOK()){
+                return element
+            }else{
+                this.findNode(element)
+            }
+        }
+        return null
+    }
+
+}

+ 9 - 0
assets/Script/game/fight/object/AI/behavior/BehaviorTree.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "3441c019-dc3a-494b-85ad-d9f08a41b28e",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 12 - 0
assets/Script/game/fight/object/AI/behaviorNode.meta

@@ -0,0 +1,12 @@
+{
+  "ver": "1.1.2",
+  "uuid": "c54952bb-0acc-4f9c-a884-f31cfa572075",
+  "isBundle": false,
+  "bundleName": "",
+  "priority": 1,
+  "compressionType": {},
+  "optimizeHotUpdate": {},
+  "inlineSpriteFrames": {},
+  "isRemoteBundle": {},
+  "subMetas": {}
+}

+ 23 - 0
assets/Script/game/fight/object/AI/behaviorNode/BehaviorDead.ts

@@ -0,0 +1,23 @@
+import BehaviorNode, { BehaviorNodeType } from "../behavior/BehaviorNode";
+import BehaviorTree from "../behavior/BehaviorTree";
+
+export default class BehaviorDead extends BehaviorNode {
+
+    constructor(behaviorTree:BehaviorTree){
+        super(behaviorTree);
+        this.type = BehaviorNodeType.Action
+    }
+
+    public isOK():boolean{
+        return true
+    }
+    /**
+     * 执行当前节点
+     * @param callback 执行结束后回调
+     */
+    public run(callback:(behaviorNode)=>void){
+        let sprite = this.behaviorTree.sprite
+        sprite.dead()
+        callback(null)
+    }
+}

+ 9 - 0
assets/Script/game/fight/object/AI/behaviorNode/BehaviorDead.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "8cf3d7cf-149e-4b80-b29a-7038caaf0281",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 29 - 0
assets/Script/game/fight/object/AI/behaviorNode/BehaviorHP.ts

@@ -0,0 +1,29 @@
+import BehaviorNode, { BehaviorNodeType } from "../behavior/BehaviorNode";
+import BehaviorTree from "../behavior/BehaviorTree";
+/**
+ * 气血条件节点 
+ * < 0 执行死亡
+ * > 0 搜寻目标
+ */
+export default class BehaviorHP extends BehaviorNode {
+    
+    constructor(behaviorTree:BehaviorTree){
+        super(behaviorTree);
+        this.type = BehaviorNodeType.Conditinals
+    }
+
+    public isOK():boolean{
+        return true
+    }
+    /**
+     * 执行当前节点
+     * @param callback 执行结束后回调
+     */
+    public run(callback:(behaviorNode)=>void){
+        if(this.behaviorTree.sprite.hp < 0){
+            callback(this.childNode[0])
+        }else{
+            callback(this.childNode[1])
+        }
+    }
+}

+ 9 - 0
assets/Script/game/fight/object/AI/behaviorNode/BehaviorHP.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "1d37f0e1-c766-4337-8bd3-9ade700ad54c",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 31 - 0
assets/Script/game/fight/object/AI/behaviorNode/BehaviorTarget.ts

@@ -0,0 +1,31 @@
+import BehaviorNode, { BehaviorNodeType } from "../behavior/BehaviorNode";
+import BehaviorTree from "../behavior/BehaviorTree";
+/**
+ * 目标条件节点
+ * 0:没有目标
+ * 1:有目标
+ */
+export default class BehaviorTarget extends BehaviorNode {
+
+    constructor(behaviorTree:BehaviorTree){
+        super(behaviorTree);
+        this.type = BehaviorNodeType.Conditinals
+    }
+
+    public isOK():boolean{
+        return true
+    }
+    /**
+     * 执行当前节点
+     * @param callback 执行结束后回调
+     */
+    public run(callback:(behaviorNode)=>void){
+        let sprite = this.behaviorTree.sprite;
+        let enemy = sprite.findEnemy(600)
+        if(enemy.sprite == null){
+            callback(this.childNode[0])
+        }else{
+            callback(this.childNode[1])
+        }
+    }
+}

+ 9 - 0
assets/Script/game/fight/object/AI/behaviorNode/BehaviorTarget.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "3fa1e043-bb7f-4d28-bd05-bad8b94e7c12",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 5 - 7
assets/Script/game/fight/object/FSprite.ts

@@ -63,10 +63,6 @@ export default class FSprite extends FObject {
 
     public mAtkSite: sp.spine.Bone = null;//子弹发射插槽
     public mWeapon1: sp.spine.Bone = null;//武器
-    /**
-     * 子弹射程
-     */
-    public mButtleDis = 10;
 
     mPanels: Array<FPanel> = [];//显示面板
 
@@ -199,7 +195,6 @@ export default class FSprite extends FObject {
         //mBullet
         if (this.mBullet) {
             let node = cc.instantiate(this.mBullet);
-            this.mButtleDis = node.getComponent(BObject).distance;
             node.destroy();
         } else {
             if (!attrData.bullet) {
@@ -213,7 +208,6 @@ export default class FSprite extends FObject {
                     //加载结束
                     this.mBullet = prefab;
                     let node = cc.instantiate(this.mBullet);
-                    this.mButtleDis = node.getComponent(BObject).distance;
                     node.destroy();
                 }
             });
@@ -251,7 +245,6 @@ export default class FSprite extends FObject {
                 //加载结束
                 this.mBullet = prefab;
                 let node = cc.instantiate(this.mBullet);
-                this.mButtleDis = node.getComponent(BObject).distance;
                 node.destroy();
             }
         });
@@ -907,4 +900,9 @@ export default class FSprite extends FObject {
         }
     }
 
+    public dead(){
+
+    }
+
+
 }

+ 1 - 8
assets/Script/game/fight/object/skill/SkillBase.ts

@@ -34,16 +34,9 @@ export default class SkillBase extends cc.Component {
      * 技能CD时间
      */
     @property({
-        displayName: '移动速度'
+        displayName: '子弹速度'
     })
     public speed:number = 500;
-    /**
-     * 技能释放到结束的时间
-     */
-    @property({
-        displayName: '技能持续的时间(毫秒)'
-    })
-    public continued:number = 2000;
     /**
      * 开始计时
      */

+ 2 - 1
assets/Script/game/fight/object/skill/SkillCharge.ts

@@ -62,7 +62,8 @@ export default class SkillCharge extends SkillBase {
 
     private moveGO(angle,callback:()=>void){
         this.sprite.playAction(SpriteActionType.atk,false,()=>{
-            this.AI.walk(this.range);
+            // this.AI.walk(this.range);
+            this.sprite.playAction(SpriteActionType.stand,true)
         });
         let pos = cc.v2();
         let length = this.mRedGo.width;

+ 4 - 1
assets/Script/game/fight/object/skill/SkillFixed.ts

@@ -40,6 +40,7 @@ export default class SkillFixed extends SkillBase {
         let bNode = cc.instantiate(this.mBullet)
         
         let bobject = bNode.getComponent(BObject)
+        bobject.distance = this.range
         let sf = bobject.mStartEffect
 
         let x = this.sprite.mAtkSite.worldX * this.sprite.spine.node.scaleX
@@ -64,7 +65,8 @@ export default class SkillFixed extends SkillBase {
         //----开始动画播放结束
 
         this.sprite.playAction(SpriteActionType.atk, false, () => {
-            this.AI.walk(this.range);
+            // this.AI.walk(this.range);
+            this.sprite.playAction(SpriteActionType.stand,true)
         });
         let tp = target.node.getPosition();
         for (let i = 0; i < this.count; i++) {
@@ -98,6 +100,7 @@ export default class SkillFixed extends SkillBase {
 
         let bObject = node.getComponent(BObject);
         bObject.setSprite(this.sprite);
+        bObject.distance = this.range
         bObject.speed = this.speed;
         node.parent = this.sprite.map.mSprites;
         let p1 = node.getPosition();

+ 4 - 1
assets/Script/game/fight/object/skill/SkillRotate.ts

@@ -41,6 +41,7 @@ export default class SkillRotate extends SkillBase {
         //-----播放开始动画
         let bNode = cc.instantiate(this.mBullet)
         let bobject = bNode.getComponent(BObject)
+        bobject.distance = this.range
         let sf = bobject.mStartEffect
 
         let x = this.sprite.mAtkSite.worldX * this.sprite.spine.node.scaleX
@@ -66,7 +67,8 @@ export default class SkillRotate extends SkillBase {
 
 
         this.sprite.playAction(SpriteActionType.atk,false,()=>{
-            this.AI.walk(this.range);
+            // this.AI.walk(this.range);
+            this.sprite.playAction(SpriteActionType.stand,true)
         });
         let tp = target.node.getPosition();
         for (let i = 0; i < this.count; i++) {
@@ -97,6 +99,7 @@ export default class SkillRotate extends SkillBase {
         let bObject = node.getComponent(BObject);
         bObject.setSprite(this.sprite);
         bObject.speed = this.speed;
+        bObject.distance = this.range
         node.parent = this.sprite.map.mSprites;
         let p1 = node.getPosition();
 

+ 4 - 1
assets/Script/game/fight/object/skill/SkillShotgun.ts

@@ -48,6 +48,7 @@ export default class SkillShotgun extends SkillBase {
         
         let bobject = bNode.getComponent(BObject)
         let sf = bobject.mStartEffect
+        bobject.distance = this.range
 
         let x = this.sprite.mAtkSite.worldX * this.sprite.spine.node.scaleX
         let y = this.sprite.mAtkSite.worldY
@@ -71,7 +72,8 @@ export default class SkillShotgun extends SkillBase {
         //----开始动画播放结束
 
         this.sprite.playAction(SpriteActionType.atk, false, () => {
-            this.AI.walk(this.range);
+            // this.AI.walk(this.range);
+            this.sprite.playAction(SpriteActionType.stand,true)
         });
         let tp = target.node.getPosition();
         for (let i = 0; i < this.count; i++) {
@@ -106,6 +108,7 @@ export default class SkillShotgun extends SkillBase {
         let bObject = node.getComponent(BObject);
         bObject.setSprite(this.sprite);
         bObject.speed = this.speed;
+        bObject.distance = this.range
         node.parent = this.sprite.map.mSprites;
         let p1 = node.getPosition();
 

+ 1 - 1
assets/resources/prefab/common/hp_monter_red.prefab

@@ -122,7 +122,7 @@
       "__type__": "TypedArray",
       "ctor": "Float64Array",
       "array": [
-        -37.232,
+        -37,
         0,
         0,
         0,

File diff ditekan karena terlalu besar
+ 606 - 406
assets/resources/prefab/map/map1.prefab


+ 11 - 7
local/local.json

@@ -1,10 +1,8 @@
 {
   "last-edit": "2d2f792f-a40c-49bb-a189-ed176a246e49",
   "recent-items": [
-    "17ad2a77-62ab-4903-ac54-252be1792308",
     "c9487f27-70f0-4012-bf79-ce48f9814dcb",
     "9fb099ea-142d-418f-a1e8-f5a46e4f27ee",
-    "11364221-35d8-475e-b9ec-43ab3aa2993d",
     "54e0cd76-2c63-4e23-b81c-97efe2699791",
     "b20fa46e-e493-40ba-a335-7379ec86a2cb",
     "51a7178b-1133-44d1-92b5-5f5e1e2348a4",
@@ -12,21 +10,27 @@
     "ed2eb25b-c86d-45e1-af89-df8acbd7b3f0",
     "2576e95c-82ed-42b3-8927-2e79aa6486b0",
     "905aac31-214a-4652-8e15-ae6afd4bb8b9",
-    "00e7d7b2-4a8c-47e2-be29-2a79dee2c720",
     "17196ada-2513-46d0-bdd4-961a13bf430d",
     "d68bf72b-7bdb-48f0-be9a-3b0a4de7f2ce",
     "1edbf86f-3486-408d-97ec-bc31fb6395d1",
-    "ff982981-097a-4e0e-8734-bfc340c5f129",
     "aa4d574e-420c-47ae-bfa1-768309e25aa0",
     "3d970ea4-c1a7-4b5e-a794-be2a897474f0",
     "1fbc18b8-3bde-4f5f-8f1d-e7ce637b6616",
-    "2d2f792f-a40c-49bb-a189-ed176a246e49",
-    "81823765-7aef-47ac-b793-287673d47aa3",
+    "35b14081-9e0f-45a5-a804-a787c942ff47",
     "c1fa2217-e454-46ca-ad7b-31c2afa8adc4",
     "1cc87fa7-097b-4f10-aecb-49dcb1713bac",
     "e18cbf3b-5ab8-4c87-871a-a2c51ce55790",
+    "81823765-7aef-47ac-b793-287673d47aa3",
     "d14d519b-6493-4bf0-bbdd-1438c31926e2",
-    "35b14081-9e0f-45a5-a804-a787c942ff47",
+    "00e7d7b2-4a8c-47e2-be29-2a79dee2c720",
+    "2d2f792f-a40c-49bb-a189-ed176a246e49",
+    "ff982981-097a-4e0e-8734-bfc340c5f129",
+    "45bf96c6-d384-4b20-acce-9ce392c137ac",
+    "ef51e114-7b1f-486c-9269-6af26d417ae8",
+    "17ad2a77-62ab-4903-ac54-252be1792308",
+    "11364221-35d8-475e-b9ec-43ab3aa2993d",
+    "68a3997f-98c2-4008-8a2a-569dad5ab209",
+    "c41951b4-1379-413b-84ba-62e45c5e4561",
     "1dd1b738-6fcc-472c-aef0-635d214a6118"
   ]
 }