Yes Second Life

セカンドライフに早9年、現役セカンドライファーの考えてること

セカンドライフ Animesh 応用編

この記事はセカンドライフ技術系アドベントカレンダー2019向けの記事です。

セカンドライフ技術系 Advent Calendar 2019 - Adventar

前回の基本編でオブジェクトをアニメーションさせれるようになったのですが、あのままではずっとその場で再生するだけです。セカンドライフにはPathfindingというオブジェクトをNPCのように動かす機能があります。今回はそれと組み合わせることで、NPCのように動作するAnimeshを作成してみます。

Pathfindingとは

Pathfindingとは、オブジェクトをNPCのように動作させる仕組みです。オブジェクトに以下のような動作をさせられます。

目的地へ移動 llNavigateTo
追跡 llPursue
逃走 llEvade
離れる llFleeFrom
巡回 llPatrolPoints
徘徊 llWanderWithin

AnimeshとPathfindingを組み合わせる

今回は追跡のPathfindingとAnimeshを組み合わせて、自分についてくるNPCを作ってみます。ずっと歩くアニメーションを再生していると自分が止まったときにも歩き続けて不自然なので、Timerで自分の速度を監視して一定の速度以下になったらアニメーションを停止するようにしてみます。

// 歩きのアニメーション名
string ANIM_NAME = "walk";

default
{
	state_entry()
	{
		// このオブジェクトをPathfindingのキャラクターに設定、追跡速度は2.0
		llCreateCharacter([CHARACTER_DESIRED_SPEED, 2.0]);

		// オブジェクトオーナーの追跡を開始
		llPursue(llGetOwner(), []);

		// 0.25秒ごとにタイマーイベント設定
		llSetTimerEvent(0.25);
	}

	on_rez(integer start_param)
	{
		// Rez時にリセット
		llResetScript();
	}

	timer()
	{
		// 一定の速度以下の場合
		if(llVecMag(llGetVel()) < 0.1)
		{
			// 歩きのアニメーションを停止する
			llStopObjectAnimation(ANIM_NAME);
		}
		// 一定の速度以上の場合
		else
		{
			// 歩きのアニメーションを実行する
			llStartObjectAnimation(ANIM_NAME);
		}
	}
}

アニメーションを実行中にllStartObjectAnimationしたり、停止中にllStopObjectAnimationしてもエラーはでなかったので、チェックはなしでシンプルに実装しました。実際の動作は動画でどうぞ( ̄∇  ̄ )

AnimeshをPathfindingと組み合わせることで、かなり本格的なNPCがつくれます。単についてくるだけじゃなくてウロウロさせたり逃走させたり色々できるので可能性無限大ですね( ̄∇  ̄ )