Unity3D / Flashからの移植
unity3dで以前Flashでつくったものをつくりなおしてみます。
unity3d v3 proで作成しています。
サンプルはcubeを80個、床面とそれぞれのオブジェクトに対して影、ImageEffectsのDepth Of Fieldを使用しています。
左上のPhysicボタンで、物理エンジンのオン/オフ切り替え。
オン時にはオブジェクトに対してランダムに力が働くようにしています。
scriptはわりと流用ができて移植は楽でした。
いくつか注意点としては、unity3dではステージはボタンなど2D上のUIに対してのインタラクションは OnGUI に記載します。
また、var currentEvent: Event = Event.current;
でイベントが所得できて、isKey、isMouseでイベントの種類がを知ることができます。
EventTypeでMouseDown、MouseUpなどEventのタイプを知ることが出来ます。
Flashからの移植に関してやったことは、enterframeの中をUpdateの中へstageに関連するイベントをOnGUIへ移し、MathをMathfへMath.random()をRandom.Range()に変更、オブジェクトのマテリアルやライティングの設定はunityのGUIをつかった設定しています。
作成したスクリプトはgameObject「_mainScript」に設定しています。
スクリプトは下のような感じです。
openGLで影とかつくろうとするとGLSLとか使ったりと、割と手間がかかったりするのですがunity3dをつかうと簡単につくれます。
mainScript.js
public var obj: GameObject; public var num: int = 80; private var btnRect:Rect = Rect(10,10,100,20); private var lookTarget: Vector3; private var objcts: Array; private var isPhysic: boolean = false; private var camTransform: Transform; function Update () { // Mouse Interactive var _camera: Vector3 = new Vector3(); easePitch += (cameraPitch - easePitch) * 0.2; easeYaw += (cameraYaw - easeYaw) * 0.2; _camera.x = 500 * Mathf.Sin(easeYaw * Mathf.PI/180); _camera.z = 500 * Mathf.Cos(easeYaw * Mathf.PI/180); _camera.y = 20 * easePitch; camTransform.position = _camera; camTransform.LookAt(lookTarget); } function Awake() { lookTarget = new Vector3(0,100,0); camTransform = Camera.main.transform; objcts = new Array(); for(var i: int = 0; i < num; i++){ var pos: Vector3 = Vector3(Random.Range(-1.0,1.0), Random.Range(-1.0,1.0), Random.Range(-1.0,1.0)); pos *= 400; pos.y *= 0.5; pos.y += 250; var _obj = Instantiate (obj, pos, Quaternion.identity) as GameObject; _obj.transform.Rotate(Vector3(Random.Range(-1.0,1.0)*360.0, Random.Range(-1.0,1.0)*360.0, Random.Range(-1.0,1.0)*360.0)); _obj.transform.parent = this.gameObject.transform; _obj.rigidbody.Sleep(); objcts.Push(_obj); } } function OnGUI() { // btn var str: String = isPhysic ? "on" : "off"; if (GUI.Button(btnRect, "Physic: "+str)) { usePhysic(); } // mouse var currentEvent: Event = Event.current; if(currentEvent.isMouse){ if(Event.current.type == EventType.MouseDown){ Debug.Log("MOUSE_DOWN"); _OnMouseDown(currentEvent); } if(Event.current.type == EventType.MouseUp){ _OnMouseUp(); } if(_isMouseDown){ _OnMouseMove(currentEvent); } } } function usePhysic() { for(var i:int = 0; i < objcts.length; i++){ var obj: GameObject = objcts[i]; var rigid: Rigidbody = obj.rigidbody; if(!isPhysic){ rigid.WakeUp(); var v: Vector3 = new Vector3(Random.Range(-1.0, 1.0), Random.Range(-1.0, 1.0), Random.Range(-1.0, 1.0)); rigid.AddForce(v * 7000); }else{ rigid.Sleep(); } } isPhysic = !isPhysic; } // ---------------------------------------------- // Mouse Interactive // ---------------------------------------------- private var isOribiting: boolean; private var cameraPitch: float = 30; private var cameraYaw: float = 90; private var previousMouseX: float; private var previousMouseY: float; private var easePitch: float = 270; private var easeYaw: float = 90; private var _isMouseDown: boolean = false; function _OnMouseDown(currentEvent: Event) { var stageX: float = currentEvent.mousePosition.x; var stageY: float = currentEvent.mousePosition.y; isOribiting = true; previousMouseX = stageX; previousMouseY = stageY; _isMouseDown = true; } function _OnMouseUp():void { isOribiting = false; _isMouseDown = false; } private function _OnMouseMove(currentEvent: Event):void { var stageX: float = currentEvent.mousePosition.x; var stageY: float = currentEvent.mousePosition.y; var differenceX: float = stageX - previousMouseX; var differenceY: float = stageY - previousMouseY; if(isOribiting) { cameraPitch += differenceY * 0.25; cameraYaw += differenceX * 0.25; cameraPitch = Mathf.Max(5, Mathf.Min(cameraPitch, 360)); previousMouseX = stageX; previousMouseY = stageY; } }
Please Leave a Reply
TrackBack URL :