[Unity][iTween]クリック地点まで自動アニメート

クリック地点までの位置の補間をiTweenを利用してみます。

目標

今回は画面をクリックし、オブジェクトがあった場合、その位置まで球を移動させます。以下は実際に作成した成果です。

位置を更新しながら補間

iTweenでは***Updateというメソッドは、現在の状態からメソッドで指定した状態までを補間するメソッドです。今回は位置を補間するのでMoveUpdateメソッドを利用します。

http://itween.pixelplacement.com/documentation.php

http://itween.pixelplacement.com/documentation.php

MoveUpdate(GameObject target, Vector3 position, float time)

MoveUpdate(GameObject target, Hashtable args)

***UpdateメソッドはMonoBehaviourのUpdateメソッドのような、繰り返し実行される処理の中に入れて更新し続けることによって、引数timeで指定した時間で目的の状態に変化します。

準備

オブジェクト

今回は以下のオブジェクトを用意し、Hierarchyに配置しました。

  • Ball (GameObject)(trace.cs付加)
    • Sphere(球オブジェクト)(チェック模様のマテリアル付加)
  • Cube(立方体オブジェクト)
  • Directional light(平行光源)
  • Main Camera(カメラ)
  • Plane(平面オブジェクト)
  • Sphere(球オブジェクト)
  • Sphere(球オブジェクト)
  • Sphere(球オブジェクト)
  • StartPosition(GameObject)

すべてのSphereオブジェクトにはRigidBodyを設定しています。ただし、Ballの子のSphereはisKinematicをオンにしています。

オブジェクトはそれぞれ下図のように配置しています。

update_view

BallとShpereは何故親子関係を設定しているのかというと、Sphereの底面の位置をBall(GameObject)にして、移動するときに床にめり込まないようにしています。

スクリプト

今回用意したスクリプト(trace.cs)は、クリックした位置に、付加したオブジェクトを移動させます。Ballに対して付加しています。

using UnityEngine;
using System.Collections;

public class trace : MonoBehaviour {
	// 開始位置のオブジェクト
	public GameObject StartPosition;
	private RaycastHit hit;
	// Use this for initialization
	void Start () {
		// 開始位置をとりあえずゴールを開始位置のオブジェクトの位置に
		hit.point = StartPosition.transform.position;
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetMouseButtonDown(0)){
			// クリックした画面から半直線(ray)を生成
			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
			// 半直線にヒットした情報をhit変数に格納
			Physics.Raycast(ray,out hit);
		}
		// 位置を更新し続ける
		iTween.MoveUpdate(gameObject,hit.point,2.0f);
	}
}

このスクリプトのキモとなるところは、MoveUpdateには常にゴールを設定しなければいけないので、あらかじめhitのpositionに開始位置を記録しています(11行目)

おわりに

iTweenのUpdateを使うと、ゴールを素早く変更して経路を変えることができます。このメソッドは移動する物体を追跡するような処理に非常に有効に働くようです。