🕒

ワールドクラフトでアナログ時計

2023/02/12に公開

リクエストをサクっと処理。

ワールドクラフトで使えるアナログ時計です。

unitypackage

cluster公式さんの「テンプレートワールド」など、クラフトアイテムをアップロードできる状態のUnityのプロジェクトに読み込んでください。
モデル・マテリアル・スクリプトなどなど、改変はお好きにどうぞ~

https://vins-jp.sakura.ne.jp/pack/wc_clock.unitypackage

基本に自信がない人は

クラフトアイテムアップロードの基本はこの記事を。
スクリプトの基本はこの記事を。

スクリプト全文

秒針が要らない場合はrotatorNumを2にして、プレハブの中にあるClockHand2を削除しちゃってください。
その場合、refreshPerTickも10.0か15.0くらいに上げてしまって良いでしょう。わずかなりとも動作が軽くなります。

最初に出したときのスクリプト、短針の動きがおかしかった(1時間経つまで短針が全く動かなかった)ので修正しました。。。スミマセン

const refreshPerTick = 1.0;

const rotatorNum = 3;
const rotatorsAr = [];
for (let rotatorNo = 0; rotatorNo < rotatorNum; rotatorNo++) {
	rotatorsAr.push($.subNode("ClockHand" + rotatorNo));
}

const initProc = () => {
	$.state.initialized = true;
	$.state.tick = 0;

	checkClock();
}

const checkClock = () => {
	const nowTime = new Date();
	const minutes = nowTime.getMinutes();
	const minutesRot = minutes * 360 / 60;
	const hoursRot = (nowTime.getHours() % 12+minutes/60) * 360 / 12;
	rotatorsAr[0].setRotation(new Quaternion().setFromEulerAngles(new Vector3(0, 0, -hoursRot)));
	rotatorsAr[1].setRotation(new Quaternion().setFromEulerAngles(new Vector3(0, 0, -minutesRot)));

	if (rotatorNum >= 3) {
		const secondsRot = nowTime.getSeconds() * 360 / 60;
		rotatorsAr[2].setRotation(new Quaternion().setFromEulerAngles(new Vector3(0, 0, -secondsRot)));
	}
}


$.onUpdate((deltaTime) => {
	if (!$.state.initialized) {
		initProc();
	}

	$.state.tick += deltaTime;
	if ($.state.tick >= refreshPerTick) {
		checkClock();
		$.state.tick -= refreshPerTick;
	}
});


$.onInteract((flag) => {
	//クリックしてOwnerになって滑らかな動きにするためだけに付けている
});

Discussion