「ニワトリを見守る会」のClusterScript
はじめに
どうも、あばっしゅ!まさぴーです。初めてnoteの記事を書くので、つたない部分もあるかと思いますが、ご容赦ください。
私は2022年の11月頃にclusterを初めて、なぜか、自分のワールドが作りたくなり、unityをいろいろ勉強しながら、ポニーに乗って遊ぶのワールドを同11月にオープンさせました。
今回ご紹介するのは、clusterの"2023年1月のお題企画「続・四畳半のメタバース」"に応募するために2023年1月に作った「ニワトリを見守る会」のワールドのClusterスクリプト(ClusterScript、JavaScript、以下scriptと記載)のコード紹介等の記事になります。
Untiyでワールド作成経験者向けの記事になります。基礎知識に関しては全く触れていませんのでご容赦ください。
ClusterScriptの基本に関しては下記情報等がとても参考になると思います。
clusterについて知りたいとか、Unityでのワールド作成を勉強したい方はvinsさんの著書をお勧めします。
ワールドの紹介
「ニワトリを見守る会」は、みんなでニワトリが卵を産むのを見守りながら、のんびりした時間を過せるワールドです。
ニワトリ 一匹 と ひよこ 2匹が 4畳半の柵の中にいて(人は入れない)
それを外から見守るだけ。
ニワトリが時々産む、卵の種類が ノーマル、シルバー、ゴールドの3種類あって、画面の右下に、出会った数が記録されます(ワールド/を抜けても保存される記録)
おかげ様で「スワン賞」をいただくことができました!
scriptを使っている箇所
ニワトリとひよこの動きを含むランダム要素をscriptを使って実装しています。基本的な箇所は両方ともほぼ共通です。ランダムでキャラクターを動かしたい場合に活用できるかなと思います。
scriptの全文
//★ひよこ0.04 にわとり0.1
const c_speed = 0.1;
const c_x_max =0.7;
const c_x_min =-0.7;
const c_z_max =0.7;
const c_z_min =-0.7;
//★ひよこ40 にわとり30
const c_run_count = 30;
//時間経過
$.state.tick = 0;
//のんびり動かす
let run_count = 0;
$.onUpdate(deltaTime => {
$.state.tick += deltaTime;
//のんびり動かす
run_count +=1;
//■ログ出し
$.log(run_count);
if (run_count>=c_run_count){
run_count = 0;
//現状位置を取ってくる
let old_pos=new Vector3();
old_pos=$.getPosition();
let l_x=old_pos.x;
let l_z=old_pos.z;
let l_kaiten=0;
//20パターンのうごき
let run_run=Math.floor( Math.random() * 21);
//■強制セット(テストするときに使う)
//run_run =9;
switch(run_run){
case 1:
if (l_x <=c_x_max){
l_x=l_x + (c_speed /2);
}
if (l_z <=c_z_max){
l_z=l_z + (c_speed /2);
}
l_kaiten=45;
break;
case 2:
if (l_x <=c_x_max){
l_x=l_x + c_speed;
}
l_kaiten=90;
break;
case 3:
if (l_x <=c_x_max){
l_x=l_x + (c_speed /2);
}
if (c_z_min <=l_z){
l_z=l_z - (c_speed /2);
}
l_kaiten=135;
break;
case 4:
if (c_z_min <=l_z){
l_z=l_z - c_speed;
}
l_kaiten=180;
break;
case 5:
if (c_x_min <=l_x){
l_x=l_x - (c_speed /2);
}
if (c_z_min <=l_z){
l_z=l_z - (c_speed /2);
}
l_kaiten=225;
break;
case 6:
if (c_x_min <=l_x){
l_x=l_x - c_speed;
}
l_kaiten=270;
break;
case 7:
if (c_x_min <=l_x){
l_x=l_x - (c_speed /2);
}
if (l_z <=c_z_max){
l_z=l_z + (c_speed /2);
}
l_kaiten=315;
break;
case 8:
if (l_z <=c_z_max){
l_z=l_z + c_speed;
}
l_kaiten=0;
break;
case 9:
//音鳴らすとかアニメーションとかいろいろ
$.sendSignalCompat("this","action");
break;
case 10:
//移動以外
break;
default:
//移動以外
break;
}
//移動させる
let pos = new Vector3(l_x,old_pos.y,l_z);
$.setPosition(pos);
//方向を向く
$.setRotation(new Quaternion().setFromEulerAngles(new Vector3(0,l_kaiten,0)));
}
}
);
上記がscript全文です。軽く解説していきますね。
コメントとかもそのまんまです。。。
scriptの解説
//★ひよこ0.04 にわとり0.1
const c_speed = 0.1;
const c_x_max =0.7;
const c_x_min =-0.7;
const c_z_max =0.7;
const c_z_min =-0.7;
//★ひよこ40 にわとり30
const c_run_count = 30;
c_speed変数で移動距離を示しいています。ここがニワトリとひよこの違いですね。ひよこの方がよちよち動く。
c_run_count は数が小さい方が動作頻度が多くなるようにしています。ニワトリが30、ひよこが40ですね。
clusterスクリプトでは、ぐるぐるーっと高速で動く処理の中で、動きを作るイメージなのですが、ニワトリは30回ごとに動く、ひよこが40回ごとに動くみたいな感じになります。
$.onUpdate(deltaTime => {
$.state.tick += deltaTime;
//のんびり動かす
run_count +=1;
//■ログ出し
$.log(run_count);
if (run_count>=c_run_count){
$.onUpdate(deltaTime => { がぐるぐるーっと回る処理ループになります
回るたびに run_countを増やしていって、上記で指定した回数になるとメインの処理をうごかします
//現状位置を取ってくる
let old_pos=new Vector3();
old_pos=$.getPosition();
let l_x=old_pos.x;
let l_z=old_pos.z;
let l_kaiten=0;
今のオブジェクトの現在地を取得しています。回転はさせないので0セット
//20パターンのうごき
let run_run=Math.floor( Math.random() * 21);
//■強制セット(テストするときに使う)
//run_run =9;
1~20の乱数を発生しています。コメント化してますけどテスト用に固定値にしてテストしたりもします。
乱数発生に関してはこちらの下記の記事が参考になるかなと思います
switch(run_run){
case 1:
if (l_x <=c_x_max){
l_x=l_x + (c_speed /2);
}
if (l_z <=c_z_max){
l_z=l_z + (c_speed /2);
}
l_kaiten=45;
break;
case 2:
if (l_x <=c_x_max){
l_x=l_x + c_speed;
}
l_kaiten=90;
break;
case 3:
if (l_x <=c_x_max){
l_x=l_x + (c_speed /2);
}
if (c_z_min <=l_z){
l_z=l_z - (c_speed /2);
}
l_kaiten=135;
break;
case 4:
if (c_z_min <=l_z){
l_z=l_z - c_speed;
}
l_kaiten=180;
break;
case 5:
if (c_x_min <=l_x){
l_x=l_x - (c_speed /2);
}
if (c_z_min <=l_z){
l_z=l_z - (c_speed /2);
}
l_kaiten=225;
break;
case 6:
if (c_x_min <=l_x){
l_x=l_x - c_speed;
}
l_kaiten=270;
break;
case 7:
if (c_x_min <=l_x){
l_x=l_x - (c_speed /2);
}
if (l_z <=c_z_max){
l_z=l_z + (c_speed /2);
}
l_kaiten=315;
break;
case 8:
if (l_z <=c_z_max){
l_z=l_z + c_speed;
}
l_kaiten=0;
break;
case 9:
//音鳴らすとかアニメーションとかいろいろ
$.sendSignalCompat("this","action");
break;
case 10:
//移動以外
break;
default:
//移動以外
break;
}
javascriptのcase文ですね。値に応じて処理を動かしています。
乱数が1-8が移動の処理になります。いわゆる8方向の移動ですね。
向きに応じて、l_kaitenに固定値をいれています。(マジックナンバーになってますけど。。。)
case 9 乱数が9の場合にオブジェクトにactionというシグナルを送っています。
case10 何か入れようと思ってそのままにしてました冗長ですね。
default 上記で定義した 1-9以外の場合の動きです。
まとめますと 20の数を発生させて
1-8の場合は移動、9の場合は何らかのアクションを起こしています。
10~20の場合は何もしません。
//移動させる
let pos = new Vector3(l_x,old_pos.y,l_z);
$.setPosition(pos);
//方向を向く
$.setRotation(new Quaternion().setFromEulerAngles(new Vector3(0,l_kaiten,0)));
移動させて、その方向を向かせています。
script以外の部分
下記のように ItemTriggerLottery(ランダムの動き)で動作を規定しています。
下記はニワトリの例です。鳴き声3種 アニメーションが4種類 卵の処理が1種です
アニメーションの動きとかは、私自身も詳しくないので解説はなしで、eggに関してはさらに中で ItemTriggerLottery(ランダムの動き)を記述しています
エッグの方の比率(ウエイト)に関しては企業秘密なので、モザイクかけています。(常連さんは気が付いていると思うけど。。。)
最後に卵を作るところは Create Item Gimmick で作っています。
卵側の処理は簡単にだけ紹介しますが、
卵が消えるところは OnCreateItemTriggerでタイマー起動で時間になったら
DestroyItemGimmickで消しています。
終わりに
初めてのnote記載でしたが、いかがだったでしょうか?
また来たことないよという方は、ぜひ一度お越しください。
ニワトリを見守る会ワールドにいつも来てくれている皆様に感謝を!
この記事が気に入ったらサポートをしてみませんか?