【求助】如何让NPC坐在电脑桌上

[复制链接]
205 |7
玩具店老板 发表于 2024-10-4 15:27:20 | 显示全部楼层 |阅读模式

想实现的需求:

image.png

想让右侧的NPC角色,坐到左侧的电脑桌子上。

问题描述及使用流程:
1、我在电脑桌模型的椅子位置,创建了一个【交互物】
2、我在【交互物】上也绑定了对应的动作

image.png

3、代码如下:



@Component
export default class sitdown extends Script {

    // 填写交互物的 GameObjectId
    interactiveGameObjectId = "2019BCB0";

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected async onStart() {
        // 因为是坐下是个动作,我们只需要在客户端表现,这里就在客户端运行
        if (SystemUtil.isClient()) {
         
            // 下载并加载 280824 资源:坐姿
            const a = await AssetUtil.asyncDownloadAsset("280824");
            console.log("NPC坐姿:"+a);         

            // 获取交互物
            const interactive = (await GameObject.asyncFindGameObjectById(this.interactiveGameObjectId)) as Interactor;
           
            // 通过gameObjectId查找NPC角色
            let npc = GameObject.findGameObjectById("0ACF3470") as Character;

            console.log("NPC:"+npc);
            console.log("interactive:"+interactive);


            // 让NPC坐在交互物上
            const x = interactive.enter(npc, mw.HumanoidSlotType.Buttocks,"280824");
            console.log("x:"+x);

           
        }
    }
}


运行后的问题是:NPC人物没有坐到椅子上


x的返回值  是 x:false

image.png

回复

使用道具 举报

colorful 发表于 2024-10-8 11:22:51 | 显示全部楼层
我在服务器是可以实现,但是刚开始可能找不到交互物组件,做了延迟才行

屏幕截图 2024-10-08 111925.png

回复

使用道具 举报

丸子 发表于 2024-10-8 13:31:31 | 显示全部楼层

本帖最后由 丸子 于 2024-10-8 14:33 编辑


@Component
export default class GameStart extends Script {

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        if(SystemUtil.isClient()){
            InputUtil.onKeyDown(Keys.F, ()=>{
                Event.dispatchToServer("Enter");
            });

            InputUtil.onKeyDown(Keys.G, ()=>{
                Event.dispatchToServer("Level");
            })
        }

        if(SystemUtil.isServer()){
            Event.addClientListener("Enter", ()=> {
                this.CharacterSitOnChair(true);
            })

            Event.addClientListener("Level", ()=> {
                this.CharacterSitOnChair(false);
            })
        }
    }

    /**
     * 周期函数 每帧执行
     * 此函数执行需要将this.useUpdate赋值为true
     * @param dt 当前帧与上一帧的延迟 / 秒
     */
    // protected onUpdate(dt: number): void {

    // }

    /** 脚本被销毁时最后一帧执行完调用此函数 */
    // protected onDestroy(): void {

    // }

    private async CharacterSitOnChair(sit: boolean) {
        await AssetUtil.asyncDownloadAsset("280824");
        //获取交互物
        let interactive = await GameObject.asyncFindGameObjectById("2F4B3FE7") as Interactor;
        let npc = await GameObject.asyncFindGameObjectById("1F55463B") as Character;
        if(sit){
            interactive.enter(npc);
        }else{
            interactive.leave();
            npc.worldTransform.position = new Vector(0, 0, 50);
        }
    }
}
回复

使用道具 举报

丸子 发表于 2024-10-8 13:32:14 | 显示全部楼层
本帖最后由 丸子 于 2024-10-8 14:35 编辑


回复

使用道具 举报

丸子 发表于 2024-10-8 13:33:34 | 显示全部楼层
本帖最后由 丸子 于 2024-10-8 14:36 编辑

坐下.rar (431.93 KB, 下载次数: 26)
回复

使用道具 举报

玩具店老板楼主 发表于 2024-10-22 21:45:24 | 显示全部楼层
谢谢~
回复

使用道具 举报

玩具店老板楼主 发表于 2024-10-22 22:53:36 | 显示全部楼层
如果我想让NPC自动坐到椅子上,而不需要点击F按键。该如何修改?

我尝试了下这样,但运行不成功

  1. @Component
  2. export default class GameStart extends Script {

  3.     /** 当脚本被实例后,会在第一帧更新前调用此函数 */
  4.     protected onStart(): void {
  5.         if(SystemUtil.isClient()){
  6.             this.CharacterSitOnChair(true);
  7.         }

  8.         if(SystemUtil.isServer()){
  9.            
  10.             this.CharacterSitOnChair(true);
  11.         
  12.         }
  13.     }

  14.     private async CharacterSitOnChair(sit: boolean) {
  15.         await AssetUtil.asyncDownloadAsset("280824");
  16.         //获取交互物
  17.         let interactive = await GameObject.asyncFindGameObjectById("2F4B3FE7") as Interactor;
  18.         let npc = await GameObject.asyncFindGameObjectById("1F55463B") as Character;
  19.         if(sit){
  20.             interactive.enter(npc);
  21.         }
  22.     }
  23. }
复制代码
回复

使用道具 举报

丸子 发表于 2024-10-23 14:32:16 | 显示全部楼层
可以使用触发器,发送事件
回复

使用道具 举报

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