乗り物の複数トリガー活用法
むさしは
ひやまアドカレひとりチャレンジ
Advent Calendar 2024の
12月17日枠をジャックしました(嘘)
ほしたまの王子のワードローブに
ヒップホップスタイルが加わったことで
むさしと王子が悪だくみをしようと
コソコソしていたところを
ひやまさんの12月16日の記事に
スッパ抜かれてしまいました(汗)
実は
王子とむさしはヒップホップスタイルで
モテモテになろうと企んでいたのでした!
『DJ』と『ラップ』
『ブレイキン』と『グラフィティ』は
ヒップホップの
四大要素として知られています
今回の記事では
『DJ』御用達『ターンテーブル』を
クラフトアイテムで表現します
1 乗り物機能
満を期して
clusterのクラフトアイテム界隈へ
投入された
乗り物機能に衝撃を受けた
ガチ勢たちも多いはずです
2 乗り物以外の表現の可能性も
その乗り物機能ですが
方向キーとスペース・シフトキーの
複数トリガーが魅力で
乗り物以外の表現の可能性も
広げてくれています!
この『ターンテーブル』は
2種類のトリガーですが
さらに小分けにすると6種類くらいになる
可能性があります
興味がある方は試してみてください!
3 アイテム構成
1 主な構成
大きく分けると
角の生えた『headphone』と
膝の上に置く『table』
プレイヤーが座るの『isu』の
3つの子アイテムで
構成しています
2 グリップの位置
左手のグリップ
『lefthand』の位置を調整して
『headphoneleft』の下層へ置きます
右手のグリップ
『righthand』の位置を調整して
『turnright』の下層へ置きます
3 Ridable Itemコンポーネント
『TURNTABLE-NOTE』の最上階層で
『Ridable Item』 の
コンポーネントをつけます
『Ridable Item』の
seatと『hip』
Exit Transformと『chakuchi』
Left Gripと『lefthand』
Right Gripと『righthand』を関連付けします
あと、効果音を忘れずに入れておきます
4 スクリプト
1 ソースコード
cluster公式さんの
乗り物機能のスクリプトをベースにしています
感謝です!
きえらさんの
時間管理スクリプトを活用しています
感謝です!
2 チェケラッチョの所作
スペース・シフトキーを押すと
左手をあげて
『ハッケヨイチェケラッチョ』と発声する
キーを離すと
左手が元のヘッドフォン位置に戻る
これを繰り返し行うことができる
3 スクラッチの所作
方向キー【↑↓←→】を押すと
右手でディスクを
1秒間に5回ほど小さく回転させてもどす
このときスクラッチ音がなる
4 全スクリプト
//ソースコード
//cluster公式の乗り物機能スクリプト
//きえらさんの時間管理スクリプト
//ターンライト定義
const obj = $.subNode("turnright"); //オブジェクト名
const interval = 0.25; //1回のスクラッチ秒数を書く
const second = 1; //全スクラッチの秒数を書く
const v3 = new Vector3(0,1,0); //Y軸回転
const angle = 1;
//ターンレフト定義
const subNode = $.subNode("turnleft"); //オブジェクト名
const speed = 100.0; //回転速度
const axis = new Vector3(0.0, 1.0, 0.0); //Y軸回転
//CHEKERA定義
const chekera = $.subNode("lefthand"); //左手位置
const cho = new Vector3(-0.5,0.3,-0.1); //チェケラッチョ位置
const zero = new Vector3(0.0,0.0,0.0); //戻り位置
//効果音定義
const se1 = $.audio("Audio1");
const se2 = $.audio("Audio2");
const se3 = $.audio("Audio3");
$.onRide(isGetOn => {
let isGetOn = $.state.isGetOn;
isGetOn = !isGetOn;
$.state.isGetOn = isGetOn;
$.state.count1 = 0;
$.state.count2 = 0;
$.state.time1 = 0;
$.state.time2 = 0;
$.state.originRot = obj.getRotation();
obj.setRotation($.state.originRot);
se1.play();
});
//スクラッチトリガー
$.onSteer((input,scratch) =>{
$.state.steerInput = input;
if (scratch) {
$.state.count1++;
switch($.state.count1) {
case 1:
//無為
break;
default:
se2.play();
//スクラッチ
if (!$.state.flg) {
$.state.flg = true;
}
$.state.count1 = 0;
}
}
});
//チェケラッチョトリガー
$.onSteerAdditionalAxis((input,checkitoutyo) => {
$.state.steerAdditionalAxisInput = input;
if (checkitoutyo) {
$.state.count2++;
switch($.state.count2) {
case 1:
//元に戻す
chekera.setPosition(zero);
break;
default:
//チェケラッチョ
se3.play();
chekera.setPosition(cho);
$.state.count2 = 0;
}
}
});
$.onUpdate(deltaTime => {
//初期化
if(!$.state.init) {
$.state.time1 = 0;
$.state.rotate = 1;
$.state.speed = 10;
$.state.init = true;
$.state.originRot = obj.getRotation();
}
//ターンレフト回転
subNode.setRotation(subNode.getRotation().multiply(new Quaternion().setFromAxisAngle(axis, speed * deltaTime)));
//スクラッチ判定
if (!$.state.flg) {
return;
}
//全スクラッチ制御
let time1 = $.state.time1 + deltaTime;
$.state.time1 = time1;
if (time1 < second) {
obj.setRotation(
new Quaternion().setFromAxisAngle(
v3,
(time1 % interval / interval) * angle * $.state.speed * $.state.rotate
)
);
//1回のスクラッチ制御
let time2 = $.state.time2 + deltaTime;
$.state.time2 = time2;
if (interval < time2) {
$.state.time2 -= interval;
$.state.rotate = -$.state.rotate;
$.state.speed = ($.state.speed == 10) ? 10 : 10;
}
//全スクラッチ終了
} else {
obj.setRotation($.state.originRot);
$.state.time1 = 0;
$.state.time2 = 0;
$.state.flg = false;
}
//乗り物判定
if (!$.state.driver) {
return;
}
//乗り物初期化
if (!$.state.driver.exists()) {
$.state.driver = null;
return;
}
});
5 備忘録
『onSteer』は『Switch』で
処理を1回毎に切り変えると制御しやすくなります
5 むすびに
このScriptは
公式さまをはじめ
偉大な方々のScriptの
見よう見まねでできてます
先人の方々に感謝です
創作活動は
日々の生活に潤いを与えてくれます
これからも
皆でclusterを楽しみましょう!
最後に
このスクリプトをまとめる
機会をいただいた
ひやまさんに感謝です!
【追伸】
王子!
クラブで踊りあかしましょう(笑)