[预制体] 新手引导预制体

[复制链接]
265 |2
剑寂万古 发表于 2024-1-4 13:44:43 | 显示全部楼层 |阅读模式

本帖最后由 剑寂万古 于 2024-1-4 14:19 编辑

新手引导

简介

游戏完成之后,还需要教会玩家如何进行游戏,这时候就需要一个新手引导的部分来对玩家进行引导.  
这个新手引导预制体可以进行基于ui,位置,和自定义条件的引导

预制体使用

新手引导预制体(点击下载)

<video controls src="https://cdn.233xyx.com/online/n5nCOYCYnh4C1704348152897.mp4"></video>

简单使用案例

自己使用代码时请注释掉示例


/**
 * 测试ui
 */
class TestUI extends UIScript {

    mBtn: StaleButton
    onStart() {
        this.mBtn = StaleButton.newObject();
        this.rootCanvas.addChild(this.mBtn);
        this.mBtn.text = "测试按钮";
        this.mBtn.onPressed.add(() => {
            console.log("点击测试按钮");
        })
        this.mBtn.position = new mw.Vector2(200, 200);
        this.mBtn.size = new mw.Vector2(200, 200);
    }
}
/**
 * 测试例子
 */
class TestHelper {

    //引导测试
    public static async testGuild() {
        //创建引导
        let guideModuleC = ModuleService.getModule(GuideModuleC);
        // 进行位置引导时的距离
        guideModuleC.setGuideArrowIntervalDis(100);
        // 设置引导箭头的信息
        guideModuleC.setGuideArrowPointerInfo("116496", new mw.Vector(1, 1, 1), false, 10);
        GuideContent.GuideMatrialScale = 1;
        // 创建一个UI引导
        let newGuide = guideModuleC.addGuideStageHandle(1);
        if (newGuide != null) {
            // 获取引导UI
            let uiHud = UIService.show(TestUI);
            let waitSec = false;
            // 添加一个运行函数,打印log
            newGuide.addRunFunc(() => {
                console.error("开始执行引导1");
            })
                // 添加绑定UI按钮
                .addBindUIAndTips(uiHud.mBtn, "点击")
                // 等待1秒
                .addRunFunc(() => {
                    setTimeout(() => {
                        waitSec = true;
                    }, 1000);
                })
                .addCondition(() => waitSec)
                .addBindUIAndTips(uiHud.mBtn, "再点击一次")
            // 添加一个位置引导
            newGuide.addBindWorldPos(new mw.Vector(1000, 0, 80))
        }

        //创建一个目标点引导
        let newGuide2 = guideModuleC.addGuideStageHandle(2);
        if (newGuide2 != null) {
            //UI引导完成后继续执行目标点引导
            newGuide.addRunFunc(() => {
                guideModuleC.triggerGuide(2);
            })

            //创建引导世界坐标(通过寻路导航方式)
            newGuide2.addBindWorldPos_Pointer(new mw.Vector(1500, 0, 80))
                // 普通方式
                .addBindWorldPos(new mw.Vector(1900, 0, 80))
                .addRunFunc(() => {
                    guideModuleC.triggerGuide(3);
                });

            // 在引导3中重置引导2
            let newGuide3 = guideModuleC.addGuideStageHandle(3);
            newGuide3.addRunFunc(async () => {
                let res = await guideModuleC.resetGuideById(2);
                if (res) {
                    guideModuleC.triggerGuide(2);
                }
            })
        }
        // 重置所有引导
        await ModuleService.getModule(GuideModuleC).resetAllGuideDB();

        //触发引导1
        guideModuleC.triggerGuide(1);

        //监听引导回调
        guideModuleC.guideComplateAction.clear();
        guideModuleC.guideComplateAction.add((guideId: number) => {
            console.error("引导 " + guideId + " 完成");
        })

    }

}

API参考

具体情况以代码中api为准

class GuideModuleC{
    /** 引导线缩放 */
    public arrowScale: mw.Vector
    /**
     * 引导实例完成事件。
     */
    public guideComplateAction: mw.Action1<number>
    /**
     * 获取引导线地标模式刷新频率,主要用于Pointer的渲染模式
     * @returns 
     */
    public getGuideArrowPointerUpdateInterval(): number 

    /**
     * 引导线地标模式刷新频率,角色在动,所以需要重新计算寻路路径,这个是刷新频率,单位毫秒,主要用于Pointer的渲染模式
     * @param updateInterval 更新间隔(毫秒)
     */
    public setGuideArrowPointerUpdateInterval(updateInterval: number)

    /**
     * 获取引导线地标是否粒子效果,主要用于Pointer的渲染模式
     * @returns 
     */
    public getGuideArrowPointerIsEffect(): boolean

    /**
     * 获取引导线地标guid,主要用于Pointer的渲染模式
     * @returns 
     */
    public getGuideArrowPointerGuid(): string

    /**
     * 获取引导线地标缩放信息,主要用于Pointer的渲染模式
     * @returns 
     */
    public getGuideArrowPointerScale(): Vector

    /**
     * 获取引导线最多显示的地标数量,主要用于Pointer的渲染模式
     * @returns 
     */
    public getGuideArrorShowMaxPointer(): number

    /**
     * 设置引导线地标信息,主要用于Pointer的渲染模式
     * @param guid 引导线地标对象Guid,默认 29391
     * @param scale 缩放,默认 (1, 1, 1)
     * @param isEffect 是否特效,默认 否
     * @param showPointerCount 最大显示地标数量,默认 10
     * @param matrialUpdate 材质更新函数, 不传不会覆盖默认方法。如果传 boolean 则表示是否反向
     */
    public setGuideArrowPointerInfo(guid: string, scale: Vector, isEffect: boolean, showPointerCount: number,matrialUpdate?: boolean | ((matrial: mw.MaterialInstance[], arrowGo: mw.GameObject) => void))

   /**
     * 获取引导线地标生成间隔距离,主要用于Pointer的渲染模式
     * @returns 
     */
    public getGuideArrowIntervalDis(): number

    /**
     * 设置引导线地标生成间隔距离,主要用于Pointer的渲染模式
     * @param intervalDis 间隔距离
     */
    public setGuideArrowIntervalDis(intervalDis: number)

    /**
     * 设置引导线Y缩放
     * @param scaleY 引导线Y缩放
     */
    public setGuideArrowScaleY(scaleY: number)

    /**
     * 获取引导线Y缩放
     * @returns 
     */
    public getGuideArrowScaleY(): number {
        return this._guideArrowScaleY;
    }

    /**
     * 设置引导线起始方向 偏移
     * @param distance 偏移距离
     */
    public setGuideArrowDirOffset(distance: number)

    /**
     * 获取引导线起始方向 偏移
     */
    public getGuideArrowDirOffsetDis(): number

    /**
     * 设置引导线起始坐标 z偏移
     * @param offsetZ z偏移
     */
    public setGuideArrowStartPosOffsetZ(offsetZ: number)

    /**
     * 获取引导线起始坐标 z偏移
     * @returns 
     */
    public getGuideArrowStartPosOffsetZ(): number

    /**
     * 设置引导线 & 目标点特效guid,主要用于Line的渲染模式
     * @param arrowGuid 引导线guid "0"则关闭
     * @param arrowMartialGuid 引导线材质guid "0"则关闭
     * @param targetPointEff 目标点guid "0"则关闭
     */
    public async setGuideArrowGuid(arrowGuid: string, arrowMartialGuid: string, targetPointEff: string)

    /**
     * 重置所有引导存档,以及所有引导阶段任务的状态。
     */
    public async resetAllGuideDB()

    /**
     * 重置指定的引导,会重置这个引导的存档状态,以及运行时的状态。
     * @param guideId 引导id
     * @returns 成功/失败
     */
    public async resetGuideById(guideId: number): Promise<boolean>

    /**
     * 强制完成一个引导,会添加这个引导的存档状态到已完成。
     * @param guideId 引导id
     * @returns 
     */
    public async forceComplateGuide(guideId: number): Promise<boolean>

    /**
     * 获取最后一次执行引导时的id
     */
    public getLastGuideId(): number

    /**
     * 获取当前引导id
     * @returns 返回引导id
     */
    public getCurGuideId(): number

    /**
     * 到达目标点距离判断 默认50 小于50则到达
     * @param dis 目标点判定距离
     */
    public reSetToTargetPosDistance(dis: number)

    /**
     * 获取到达目标点距离判断 默认50 小于50则到达
     * @returns 
     */
    public getToTargetPosDistance(): number 

    /**
     * 设置引导主角对象
     * @param go 主角GameObject对象
     */
    public reSetCharGo(go: mw.GameObject)

    /**
     * 获取引导主角对象
     * @returns 
     */
    public async getCharGo(): Promise<mw.GameObject>

    /**
     * 移除指定引导,但是不影响存档。
     * @param guideId
     */
    public removeGuideId(guideId: number)

    /**
     * 通过引导ID,添加引导对象实例。
     * @param guideId 引导id - 不要重复
     * @return 引导对象实例
     */
    public addGuideStageHandle(guideId: number): GuideInfo

    /**
     * 通过引导Id,触发指定的引导。同时会将对应引导示例执行起来。
     * @param guideId 引导id 
     */
    public triggerGuide(guideId: number): boolean

}
回复

使用道具 举报

剑寂万古楼主 发表于 2024-3-27 14:31:29 | 显示全部楼层
窜稀大仙 发表于 2024-1-17 14:42
哪个是示例脚本好多

在最前面的链接那里
回复

使用道具 举报

窜稀大仙 发表于 2024-1-17 14:42:39 | 显示全部楼层
哪个是示例脚本好多
回复

使用道具 举报

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