![見出し画像](https://assets.st-note.com/production/uploads/images/98769229/rectangle_large_type_2_89b934704fd12ac5551dd1db1e98c9fa.png?width=1200)
「ニワトリを見守る会」のClusterScript(改)
はじめに
1/28に公開した 「ニワトリを見守る会」のClusterScript を2/24に改変しましたので、その情報をお知らせします。
変更理由としては、ホスト(最初ワールドに入った人)の性能で、若干、処理スピードが異なっていて、抽選回数に差があったので、均等にしてみました。
以前は、ぐるぐる回る処理で、30回ループしたらというロジックだったのですが、ぐるぐる回る回数が、性能により差がありました。
実測してみると、スマホだと1秒少し、PCだと1秒未満と差がありました。
このため、1秒経過したら、というロジックに変えました。
従来のコード
const c_run_count = 30;
//時間経過
$.state.tick = 0;
//のんびり動かす
let run_count = 0;
$.onUpdate(deltaTime => {
$.state.tick += deltaTime;
//のんびり動かす
run_count +=1;
if (run_count>=c_run_count){
run_count = 0;
以下略
上記が従来のコードで、上のc_run_count(30)まで run_countが達したらという処理にしていました。
新しいコード
$.onUpdate(deltaTime => {
//値初期化
if (!$.state.initialized) {
$.state.initialized = true;
$.state.tick = 0;
$.state.trials = 0;
$.state.run = false;
$.state.old_Sec=0;
}
$.state.tick += deltaTime;
//毎秒ごとに処理
let letTimer = new Date();
let letSec=letTimer.getSeconds();
if (letSec !=$.state.old_Sec){
$.state.run =true;
}
$.state.old_Sec=letSec;
if ($.state.run){
$.state.run = false;
ちょっと初期化方法を変えたりしてますけど。。。
毎秒ごとの処理のところで、秒を取って、過去の秒と数字が変わったらということで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;
$.onUpdate(deltaTime => {
//値初期化
if (!$.state.initialized) {
$.state.initialized = true;
$.state.tick = 0;
$.state.trials = 0;
$.state.run = false;
$.state.old_Sec=0;
}
$.state.tick += deltaTime;
//毎秒ごとに処理
let letTimer = new Date();
let letSec=letTimer.getSeconds();
if (letSec !=$.state.old_Sec){
$.state.run =true;
}
$.state.old_Sec=letSec;
if ($.state.run){
$.state.run = false;
//トライアル回数を保存(test用)
$.state.trials +=1;
$.log($.state.trials);
$.setStateCompat("this", "trials",$.state.trials);
//現状位置を取ってくる
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)));
}
}
);
//トライアル回数を保存(test用) は今回の回数を計るにあたり、追加した箇所で、setStateCompatで変数に値をセットしています。
それ以外は、特に解説はないです。そのほかの箇所は過去記事参照ください。
この記事が気に入ったらサポートをしてみませんか?