見出し画像

「ニワトリを見守る会」の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で変数に値をセットしています。

それ以外は、特に解説はないです。そのほかの箇所は過去記事参照ください。



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