Unityクリエイターズ勉強会【2/2】【関西】発表資料

Post on 26-Aug-2014

2.517 views 1 download

Tags:

description

https://dl.dropbox.com/u/37779475/20130130UniBen/Desktop.html このゲームの作り方の資料です GoogleDriveにも資料があります https://docs.google.com/presentation/d/1fA7KhnVIC6F08CURKqXnrv_Z5p30K5wBj5ddFiVVayY/edit?pli=1#slide=id.g9aaefe24_089

Transcript of Unityクリエイターズ勉強会【2/2】【関西】発表資料

パーティクルで

2Dシューティング

くるくる

自己紹介

くるくる・@mkd214・22歳・大学院1回生・普段はJavaScriptでARな研究してます

Unity歴は1年半弱・簡単なプロトタイプ作って遊んでます・ゲームジャムやハッカソンによく出没

宣伝

おっさんコレクション

・Twitter上におっさんが現れるので捕まえる

・30種のおっさんをコンプリートするゲーム

・Node.js+MongoDB+DropBox

・興味のある人は @yanotasu をフォロー

早速

ゲームを作って行きましょう

どんなゲーム??

Particleがわんさかでてくるゲーム!!

と,いうことでParticleについて学ぼう!!

今日学ぶ、Particleの4つの要素

Emission Start系

Simulation SpaceShape

Emission

Emission --- パーティクルのでる数を決める

・Rate  連続してパーティクルが出る  1秒辺りにでる数を設定する・Burst  ある時間に一斉にパーティクルが出る  一斉に出る時間と数を設定する

Shape

Shape --- パーティクルのでる形

・Shape  でる形を決める・Radius,Angleなど  でる形の各部分の大きさを設定する・RandomDirection  パーティクルの出る方向をランダムにする・EmitFromShell

Shape

Shape --- パーティクルのでる形

・EmitFromShell  Trueだと表面からのみでる

  Falseだと表面を含む領域全てからでる

Start系

Start系 ---1つのパーティクルが生成された時

     に与えられるパラメータ

・StartLifeTime  出て消えるまでの時間。(寿命)・StartSpeed  出た時の速さ(マイナスの値もいれられるよ)・StartSize  出た時の大きさ

Simulation Space

SimulationSpace --- でたあとのParticleSystem          との位置の依存関係

Local

World

この4つ,なんとなくわかりましたか??

Emission Start系

Simulation SpaceShape

パーティクルを作りましょう!!

必要なパーティクル

自機(Player)チャージしてる時(Charging)チャージが完了した時(Charged)弾(Bullet)自機が死んだ時(DeadPlayer)

敵(Enemy)敵が死んだ時(DeadEnemy)

必要なパーティクル

7つのパーティクルを作成してそれぞれ名前をつけよう

次のページから,パーティクルを作っていくよ!!

自機(Player)

StartLifeTime -> 0.1StartSpeed -> 0SimulationSpace -> World

Rate -> 1000

Shape -> チェックを外す

チャージ中(Charging)

StartLifeTime -> 0.5StartSpeed -> -10

Shape -> SphereRadius -> 5EmitFromShell ->True

チャージ完了(Charged)

Rotation X -> 0

StartLifeTime -> 0.8StartSpeed -> 0StartSize -> 0.3SimulationSpace -> World

Rate -> 100Shape -> チェックを外す

弾(Bullet)

StartLifeTime -> 0.05StartSpeed -> 0StartSize -> 0.8SimulationSpace -> World

Rate -> 100Shape -> チェックを外す

自機が死んだ時(DeadPlayer)

Looping -> falseStartSpeed -> 15

Rate -> 0Time Particles -> 0.00 100 -> 0.50 100 -> 1.00 100

Shape -> Sphere

敵(Enemy)

StartLifeTime -> 0.1StartSpeed -> 0StartColor -> RedSimulation Space -> World

Rate -> 1000

Shape -> チェックを外す

敵が死んだ時(DeadEnemy)

Looping -> falseStartSpeed -> 15StartColor -> Red

Rate -> 0Time Particles -> 0.00 100

Shape -> Sphere

当たり判定と剛体の準備をしよう

当たり判定と剛体の準備をしよう

当たり判定と剛体が必要なのは

Player(自機)Bullet(弾)Enemy(敵)

SphereColliderとRigidbodyをつけておこう!!

Playerに当たり判定と剛体

Use Gravity -> falseFreezePositionZ -> trueFreezeRotationXYZ -> true

Center -> 0 0 0Radius -> 0.3

Enemyに当たり判定

Use Gravity -> falseFreezePositionZ -> trueFreezeRotationXYZ -> true

isTrigger -> trueCenter -> 0 0 0Radius -> 0.5

Bulletに当たり判定

Use Gravity -> falseFreezePositionZ -> trueFreezeRotationXYZ -> true

Center -> 0 0 0Radius -> 0.5

カメラの設定をしておこう

カメラの設定をしておこう

今回は2Dなので

Orthographicカメラを使います

Position XYZ -> 0 1 -10

Background -> Black

Projection -> OrthographicSize -> 5

Scriptを書いて動かそう!!

Playerの動きを作ろう

Player・動く(Move)・チャージする(Charge)・弾を発射する(Shoot)・敵に当たると死亡(Dead)

PlayerController.jsを作成し,

Playerに追加しておいてください

PlayerController.jsを書き換えよう.

function Update () {Move();

}function Move(){

var mouse = Input.mousePosition;var pos = Camera.mainCamera.ScreenToWorldPoint(mouse);

pos.z = 0;transform.position = pos;

}

PlayerController.jsの解説

//スクリーン上のマウスの位置を取得

var mouse = Input.mousePosition;//マウス座標からカメラ座標に変換

var pos = Camera.mainCamera.ScreenToWorldPoint(mouse);

//Zが-10が入るので0にする

pos.z = 0;//マウスの位置に動かす

transform.position = pos;

PlayerController.jsの解説

//スクリーン上のマウスの位置を取得

var mouse = Input.mousePosition;//マウス座標からカメラ座標に変換

var pos = Camera.mainCamera.ScreenToWorldPoint(mouse);

//Zが-10が入るので0にする

pos.z = 0;//マウスの位置に動かす

transform.position = pos;

**この方法はOrthographicカメラ時のみ使える

親子関係に

ChargingとChargedをPlayerの子へ

子にしたいオブジェクトをドラッグ親のオブジェクトにドロップ

親子関係に

ChargingとChargedをPlayerの子へ

子にしたいオブジェクトをドラッグ親のオブジェクトにドロップ

その後,子のPositionを(0,0,0)にしておく

PlayerController.jsの最後に追加

var chargedObj:GameObject;var chargingObj:GameObject;function Charge(){

if(Input.GetButton("Fire1")){chargingObj.SetActive(true);

}else if(Input.GetButton("Fire1")){chargingObj.SetActive(false);

}}

Chargeさせる(PlayerController.js内)

function Start () {chargingObj.SetActive(false);chargedObj.SetActive(false);

}function Update () {

Move();Charge();

}

Scriptから他Objectを操作

Playerの子のChargedをCharged Obj横のNoneにドラッグドロップ

Playerの子のChargingをCharging Obj横のNoneにドラッグドロップ

Chargeの解説

//マウスの左クリックが押されている間はTrueif(Input.GetButton("Fire1")){

//chargingObjをアクティブ(動いている状態)にします

chargingObj.SetActive(true);//マウスの左クリックが上がった瞬間だけTrue}else if(Input.GetButton("Fire1")){

//chargingObjをアクティブじゃないようにする

chargingObj.SetActive(false);}

Chargeの追加(PlayerController.js内)

private var time : float = 0.0;function Charge(){

time+=Time.deltaTime;if(Input.GetButton("Fire1")){

if(time<2) { chargingObj.SetActive(true);}else{

chargingObj.SetActive(false);chargedObj.SetActive(true);

}}else if(Input.GetButtonUp("Fire1")){

if(time<2) { chargingObj.SetActive(false);}else{chargedObj.SetActive(false);time=0;}

}}

たまを打つよ

PlayerController.jsの最後に追加

var bulletPrefab:GameObject;private var root2 = Mathf.Sqrt(2);private var x = [1,1/root2,0,-1/root2,-1,-1/root2,0,1/root2];private var y = [0,1/root2,1,1/root2,0,-1/root2,-1,-1/root2];

function Shoot(){for(var i=0;i<8;i++){

var bullet : GameObject = Instantiate(bulletPrefab);bullet.transform.position = transform.position + Vector3(x[i],y[i],0)*1.0f;

bullet.rigidbody.velocity = Vector3(x[i],y[i],0) * 15.0f;bullet.name = "Bullet";Destroy(bullet,2.0f);

}}

Shootの追加(PlayerController.js)

function Charge(){time+=Time.deltaTime;if(Input.GetButton("Fire1")){

if(time<2) { chargingObj.SetActive(true);}else{

chargingObj.SetActive(false);chargedObj.SetActive(true);

}}else if(Input.GetButtonUp("Fire1")){

if(time<2) { chargingObj.SetActive(false);}else{chargedObj.SetActive(false);time=0;Shoot();}

}}

Prefabの作り方

HierarchyのBulletをProjectにドラッグドロップ

ProjectにBulletができていれば成功

HierarchyのBulletは必要ないの削除しておきましょう

DeadPlayerとDeadEnemyとEnemyもPrefab化し,Hierarchyのは削除しましょう

関連付けよう!!

BulletPrefabに関連付けるために

ProjectのBulletをPlayerControllerのNoneにドラッグドロップ

当たり判定を作るよ!!

PlayerController.jsの最後に追加

var deadPlayerPrefab:GameObject;function OnTriggerEnter(other:Collider){

if(other.gameObject.name == "Enemy"){var obj=Instantiate(deadPlayerPrefab);obj.transform.position = transform.position;Destroy(gameObject);

}}

OnTriggerEnterの解説

//Triggerにぶつかった時に呼ばれる

function OnTriggerEnter(other:Collider){//ぶつかったオブジェクトの名前がEnemyならTrueif(other.gameObject.name == "Enemy"){

//Prefabをゲームシーンに登場させる

var obj=Instantiate(deadPlayerPrefab);//登場したPrefabの位置をPlayerの位置にする

obj.transform.position = transform.position;//Playerを消す

Destroy(gameObject);}

}

Enemyをだすよ!!

Enemyをだすよ!!

空のGameObjectを作成.

名前は Creater.

Create.jsを作成.

空のGameObjectにAdd.

右のようになっていればOK

Create.jsを編集しよう

private var time=0.0f;var prefab:GameObject;var timeInterval : float = 2.5f;function Update () {

time += Time.deltaTime;if(time > timeInterval){

time=0.0f;var obj = Instantiate(prefab);obj.transform.position.x = Random.Range(-11.20f,11.20f);obj.transform.position.y = 6;obj.transform.position.z = 0;obj.name = "Enemy";

}}

Createrの設定

PrefabがNoneになっているので

ProjectionのEnemyをドラッグドロップ

Enemyを動かすよ

Enemyの動きを知ろう

Enemy・最初に速度を設定(等速直線運動する)・下に行き過ぎたら勝手に消える・弾にあたったらやられる

Enemy.jsを作成し,

EnemyのPrefabに追加しておいてください

Enemy.jsを書き換えよう.

function Start () {rigidbody.velocity.y = -Random.Range(3.0f,10.0f);

}function Update () {

if(transform.position.y < -12.0f){Destroy(gameObject);}}var deadEnemyPrefab : GameObject;function OnTriggerEnter(other:Collider){

if(other.gameObject.name == "Bullet"){var obj:GameObject = Instantiate(deadEnemyPrefab);obj.transform.position = transform.position;Destroy(obj,3.0f);Destroy(gameObject);

}}

関連付けるよ

ProjectionのEnemyのDeadEnemyPrefabがNoneになっているので

ProjectのDeadEnemyをNoneにドラッグドロップ

完成!!!