見出し画像

乗り物の複数トリガー活用法

むさしは
ひやまアドカレひとりチャレンジ
Advent Calendar 2024の
12月17日枠をジャックしました(嘘)

ほしたまの王子のワードローブに
ヒップホップスタイルが加わったことで
むさしと王子が悪だくみをしようと
コソコソしていたところを
ひやまさんの12月16日の記事に
スッパ抜かれてしまいました(汗)

実は
王子とむさしはヒップホップスタイルで
モテモテになろうと企んでいたのでした!

むさしの頭の中にあるヒップホッパーのイメージ

『DJ』と『ラップ』
『ブレイキン』と『グラフィティ』は
ヒップホップの
四大要素として知られています
今回の記事では
『DJ』御用達『ターンテーブル』を
クラフトアイテムで表現します


1 乗り物機能

満を期して
clusterのクラフトアイテム界隈へ
投入された
乗り物機能に衝撃を受けた
ガチ勢たちも多いはずです

あーぱつあぱつ

2 乗り物以外の表現の可能性も

その乗り物機能ですが
方向キーとスペース・シフトキーの
複数トリガーが魅力で
乗り物以外の表現の可能性も
広げてくれています!

この『ターンテーブル』は
2種類のトリガーですが
さらに小分けにすると6種類くらいになる
可能性があります
興味がある方は試してみてください!

3 アイテム構成

1 主な構成

大きく分けると
角の生えた『headphone』と
膝の上に置く『table』
プレイヤーが座るの『isu』の
3つの子アイテムで
構成しています

unity画像1

2 グリップの位置

左手のグリップ
『lefthand』の位置を調整して
『headphoneleft』の下層へ置きます

unity画像2

右手のグリップ
『righthand』の位置を調整して
『turnright』の下層へ置きます

unity画像3

3 Ridable Itemコンポーネント

『TURNTABLE-NOTE』の最上階層で
『Ridable Item』 の
コンポーネントをつけます
『Ridable Item』の
seatと『hip』
Exit Transformと『chakuchi』
Left Gripと『lefthand』
Right Gripと『righthand』を関連付けします

unity画像4

あと、効果音を忘れずに入れておきます

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を楽しみましょう!

最後に
このスクリプトをまとめる
機会をいただいた
ひやまさんに感謝です!

【追伸】
王子!
クラブで踊りあかしましょう(笑)