2012年10月23日火曜日

Unity waypointスクリプト

Unity3dフォーラムで動作の制御スクリプトがあり、コメント入れなども丁寧にされているものであったので紹介したい。

今回紹介するのはwaypointという動作の制御スクリプト。敵キャラクターなどにいくつかのポイントをランダムに行き来させるような使用例があるとおもう。

どんな動作をするか例示するためにスクリプトでボールが動き回る簡単なシーンを作成した。


さらにフォーラム投稿されているコードを翻訳したものを紹介する:

コード中に英語コメントがありすぎて少し見づらかったためあえて省いたが、英語に自信ある方はリンクから丁寧なコメントもみてもらったほうが理解は進むとおもう。


waypointを実現する簡単なJavascript。

使用するときのステップ:
1.RigidBody,Colliderのあるゲームオブジェクトにこのスクリプトをアタッチする。
2.Size変数を使用したいwaypointの数に更新する
3.waypointオブジェクトをSizeの下の空きスロットの位置にドラッグ&ドロップする
4.waypointオブジェクトにColliderがあること再確認する(Sphere Collider推奨)
5.waypointオブジェクトのis TriggerチェックボックスをOnにする
6.サイズ調整(Sphere Colliderの場合は半径)を行う
7.変数の値の調整。スピードなどイメージに合うまで調整する。

var accel = 0.8;
var inertia = 0.9;
var speedLimit = 10.0;
var minSpeed = 1.0;
var stopTime = 1.0;
private var currentSpeed = 0.0;
private var functionState = 0;
private var accelState : boolean;
private var slowState : boolean;
private var waypoint : Transform;var rotationDamping = 6.0;
var smoothRotation = true;
var waypoints : Transform[];
private var WPindexPointer : int;

function Start ()
{
   functionState = 0;
}

function Update (){
   if (functionState == 0)
   {
      Accell ();
   }
   if (functionState == 1)
   {
      Slow ();
   }
   waypoint = waypoints[WPindexPointer];
}

function Accell ()
{
   if (accelState == false)
   {
      accelState = true;
      slowState = false;
   }
   if (waypoint)
   {
      if (smoothRotation)
      {
         var rotation = Quaternion.LookRotation(waypoint.position - transform.position);
         transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * rotationDamping);
      }
   }
   currentSpeed = currentSpeed + accel * accel;
   transform.Translate (0,0,Time.deltaTime * currentSpeed);
      if (currentSpeed >= speedLimit)
   {
      currentSpeed = speedLimit;
   }
}

function OnTriggerEnter ()
{
   functionState = 1;
   WPindexPointer++;
   if (WPindexPointer >= waypoints.Length)
   {
      WPindexPointer = 0;
   }
}

function Slow ()
{
   if (slowState == false)
   {
      accelState = false;
      slowState = true;
   }
   
   currentSpeed = currentSpeed * inertia;
   transform.Translate (0,0,Time.deltaTime * currentSpeed);
   if (currentSpeed <= minSpeed)
      {
      currentSpeed = 0.0;
      yield WaitForSeconds (stopTime);
      functionState = 0;
   }
}
----

Unityフォーラムのスクリプトをゲーム開発に生かそうぜ!

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ