BeamBox raycast line renderer ビーム 光線 他のオブジェクト 関数呼び出し

f:id:peroon:20110629171230p:image
回転する箱からビームが出ていて、Player(YOU)がジャンプでよけるゲーム。
ビームに当たるとYOUは血(パーティクル)を吐く。
ビームと同じ方向にRayを発射することでヒットを取っている。


Playerのスクリプト(血パーティクルは事前にPrefabにしてから登録)

var speedX : float = 3;
var jumpPower : float = 500;
 
function Update() {
	Control();
}

function Start(){
	//emitBlood();
}

function Control(){
	//X
 	var horMovement = Input.GetAxis("Horizontal");
	if (horMovement) {
		transform.Translate(transform.right * horMovement * Time.deltaTime * -speedX);
	}
	
	//Jump
	if(Input.GetButtonUp("Jump")){
		rigidbody.AddForce(Vector3.up * jumpPower);
	}
}

var bloodParticle_  : ParticleAnimator;//one shotにチェックしておこう
function emitBlood(){
	var obj = Instantiate( bloodParticle_, transform.position, transform.rotation);
	obj.autodestruct = true;
}

ビームを出す箱のスクリプト
見所:Raycast, 他のオブジェクトの関数呼び出し

var rotateYspeed = 10;

function Update () {
	//rotateY
	transform.Rotate( Vector3.up * Time.deltaTime * rotateYspeed, Space.Self);
	
	rayCast();
}

function rayCast(){
	//ray direction (local Z axis)
	//var localZdir = transform.InverseTransformDirection(Vector3.forward);//world to local
	var localZdir = transform.TransformDirection(Vector3.forward); //local to world
	Debug.DrawRay(transform.position, localZdir * 10, Color.red);
	
	//check hit
	var hit : RaycastHit;
	if(Physics.Raycast(transform.position, localZdir, hit, 10)){
		if(hit.collider.gameObject.tag == 'Player'){
			Debug.Log('hoge');
			var obj = hit.collider.gameObject;
			obj.GetComponent('PlayerController_X_Jump').emitBlood(); //access player
		}
	}
}
ローカルの軸を取得したいときは
Transform.TransformDirection  
http://unity3d.com/support/documentation/ScriptReference/Transform.TransformDirection.html

レーザーはLine Rendererで描画
Line Renderer
http://unity3d.com/support/documentation/Components/class-LineRenderer.html

マテリアルは青い光の玉テクスチャを設定。
Shader(Particles/Alpha Blended)

TODO : Line Renderの曲線版