You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GMS中如何让对象Create事件在变量赋值完成后执行

问题本质

GameMaker中调用instance_create系列函数生成实例时,实例的Create事件会在函数返回前立即执行,后续给实例属性赋值的代码会在Create事件执行完毕后才运行,因此Create事件内读取text/face/name属性时会拿到未定义的默认值,出现逻辑错误。

解决方案

以下三种方案都可以解决执行顺序问题,可根据自己使用的引擎版本选择:

  • 方案1:使用带结构体传参的实例创建函数(GMS2.3及以上版本首选)
    高版本GameMaker的instance_create_layer、instance_create_depth函数支持传入结构体参数,传入的变量会在Create事件运行前完成赋值,不需要修改原有Create事件代码,写法最简洁:
    // 注意将第二个参数替换为你项目中实际存放文本框的图层名
    text_obj = instance_create_layer(0, 0, "UI_Layer", obj_character_text, {
        text: text,
        face: face,
        name: name
    });
    
  • 方案2:拆分初始化逻辑到自定义事件(全版本兼容)
    把依赖外部赋值变量的初始化逻辑从Create事件移到自定义用户事件中,等所有变量赋值完成后手动触发初始化:
    1. 将原Create事件中的全部代码剪切到对象的User Event 0中,Create事件留空即可
    2. 调整实例创建代码:
    text_obj = instance_create(0, 0, obj_character_text);
    text_obj.text = text;
    text_obj.face = face;
    text_obj.name = name;
    text_obj.event_user(0); // 所有变量赋值完成后,手动触发初始化逻辑
    
  • 方案3:Create事件增加延迟初始化判断(不需要拆分事件)
    如果不想拆分事件逻辑,可以在Create事件开头加判断,等所需变量赋值完成后再执行初始化:
    1. 修改原Create事件代码:
    // 检测必需变量是否存在,不存在则标记待初始化后直接退出事件
    if (!variable_instance_exists(id, "text")) {
        pending_init = true;
        exit;
    }
    current_text_index = 0;
    current_text = string_char_at(text, current_text_index);
    alarm[0] = 5;
    
    1. 调整实例创建代码,赋值完成后手动触发Create事件重跑:
    text_obj = instance_create(0, 0, obj_character_text);
    text_obj.text = text;
    text_obj.face = face;
    text_obj.name = name;
    if (text_obj.pending_init) {
        text_obj.event_perform(ev_create, 0);
    }
    

内容的提问来源于stack exchange,提问作者Hexagon96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.20 16:15:50