見出し画像

LT発表スライド完全版

Liteとは言ってない。

スライド

リンク

Pin倒れた判定スクリプト(抜粋)

//上方向ベクトルと、自身の上方向ベクトルの内積が0.95以下の場合、倒れていると判定
const upVector = new Vector3(0, 1, 0);
const rot = $.getRotation();
const upVectorSelf = upVector.clone().applyQuaternion(rot);
const dot = upVector.dot(upVectorSelf);

const isDown = dot < 0.95 || $.state.isDown;

if(isDown && !$.state.isDown)
{
    playerFlow.send("OnPinDown", {pinId: $.state.pinId});
    $.state.isDown = true;
}

StateMachineサンプル

function createStateMachine() {
    const states = {};
    
    // 状態を追加する関数
    function addState(state, option) {
        states[state] = option;
    }

    // 現在の状態を取得する関数
    function getCurrentState() {
        return $.state.currentState;
    }

    // 状態を遷移する関数
    function transition(state) {
        if (states[state] == null) {
            $.log("state not found");
            return;
        }

        const currentState = $.state.currentState;
        // 現在の状態のonExit関数を呼び出す
        if (states[currentState] != null && states[currentState].onExit != null) {
            states[currentState].onExit();
        }
        // 新しい状態に遷移
        $.state.currentState = state;
        // 新しい状態のonEnter関数を呼び出す
        if (states[state].onEnter != null) {
            states[state].onEnter();
        }
    }

    // 現在の状態のonUpdate関数を呼び出す関数
    function update(dt) {
        const currentState = $.state.currentState;
        if (states[currentState] != null && states[currentState].onUpdate != null)
            states[currentState].onUpdate(dt);
    }

    // 現在の状態のonInteract関数を呼び出す関数
    function interact(player) {
        const currentState = $.state.currentState;
        if (states[currentState] != null && states[currentState].onInteract != null)
            states[currentState].onInteract(player);
    }

    return {
        addState,
        getCurrentState,
        transition,
        update,
        interact,
    };
}

let stateMachine = createStateMachine();
stateMachine.addState("stateA", {
    onEnter: () => {
        $.log("stateA onEnter");
    },
    onInteract: (player) => {
        stateMachine.transition("stateB");
    },
    onUpdate: (dt) => {
        $.log("stateA onUpdate");
    },
    onExit: () => {
        $.log("stateA onExit");
    }
});

stateMachine.addState("stateB", {
    onEnter: () => {
        $.log("stateB onEnter");
    },
    onInteract: (player) => {
        stateMachine.transition("stateC");
    },
    onUpdate: (dt) => {
        $.log("stateB onUpdate");
    },
    onExit: () => {
        $.log("stateB onExit");
    }
});

stateMachine.addState("stateC", {
    onEnter: () => {
        $.log("stateC onEnter");
    },
    onInteract: (player) => {
        stateMachine.transition("stateA");
    },
    onUpdate: (dt) => {
        $.log("stateC onUpdate");
    },
    onExit: () => {
        $.log("stateC onExit");
    }
});

$.onStart(() =>
{
    stateMachine.transition("stateA");
})

$.onInteract(player =>
{
    stateMachine.interact(player);
});

$.onUpdate(dt =>
{
    stateMachine.update(dt);
});

余談

以下のDiscordサーバーでギミック相談室とかやってます。
良ければどうぞ。

この記事が気に入ったらサポートをしてみませんか?