月別アーカイブ: 2月 2017

Blender to Unity 01 Terrain

標準

Blender LandscapeをUnity Terrainに適用するまで

A.Blender作業

1)LandScapeを利用して地形をつくる(パラメータをいろいろいじってみる)

左下に出てくるオプションで、Subdivisionは256に設定しておくと十分細かい地形を作ることが出来る。

landscape01

2)ギザギザが気になるようなら、スカルプトモードでShiftを押しながら、少しなめらかにする。

3)マテリアルを追加。色は白。Shadelessをチェック。

landscape02

4)テクスチャをBlendタイプで追加。

landscape03

5)カメラ設定。真上から。

landscape04

6)レンダリング画像設定。16bitのグレースケールになるように。また、2の2乗に1ピクセル足した大きさになるように。レンダリングしたものを保存。png形式でよい。

landscape05

7)レンダリング結果画像(png)

2049

B. Krita作業

Blenderで出力したpngファイルをそのまま、Unityで読ませようとしてうまくいかなかったので、Kritaでデータ変換する。r16形式データにするだけ。

landscape06

C.Unity作業

1)Unityで新規Terrain追加。

マテリアルがテラテラ反射していたので、適当なマテリアルに変更。

landscape07

Import Rawというボタンをクリックし、先ほど保存しておいた、Kritaで作成した、.r16ファイルをインポートする。その際、作成した大きさとMacで作成したか、Winで作成したかを確認。高さが極端に高くなるのを抑えるため、読み込み時のheightの値を少し下げるとよい(例えば、600になっていたら、それを200にするなど)

2)あとは普通のTerrainとして、樹木追加も可能、ブラシによる変更も可能。Terrainコライダーも無事についている。

landscape08

画像の縁の部分がなぜか、1ピクセル分、立ち上がっているので修正する必要があるかも。

 

広告

UnityチュートリアルSpaceShooterその6「サウンド得点完成へ」

標準

9.サウンド

Unityには3つのサウンド関係のキーワードがある。
1)Audio Clips, 2)Audio Sources, 3)Audio Listener
オーディオクリップは、サウンドファイルが収納されている音のデータである。

Audio Clipを選択すると、インスペクターには、プレビューとして、波形、試聴ボタン、ループボタンが現れる。さらにそのクリップの詳細がプレビュー画面の下に現れる。

1)オーディオクリップの3Dサウンドを無効にする(相対位置によって、聞こえ方が変わる効果)

2)クリップをプレファブオブジェクトにドラッグすると、自動的にオーディオソースコンポーネントが追加され、サウンドクリップを指定することが出来る。

Play On Awakeがチェックされていることを確認する。explosion_asteroidとexplosion_playerのプレファブに、それぞれのサウンドを入れる。

3)Playerが武器を発射したときのサウンドを入れる。ドラッグしただけだと、オーディオソースコンポーネントのPlay On Awakeが有効になってしまうので、無効にする。

4)Playerが武器を発射したときだけサウンドを出したいので、PlayerControllerスクリプトに書き加える。

ちょうど、武器(shot)をインスタンス化する部分に音をいれればいいことがわかる。
(ビデオでは、audio.となっているが、GetComponetを使わないとUnity5では動かない)

https://oc.unity3d.com/index.php/s/rna2inqWBBysn6l?_ga=1.260994632.411228565.1453178645

↑Unityチュートリアル提供、変更点一覧

private AudioSource audioSource;

void Start(){ 関数内に

audioSource=GetCompornent<AudioSource>();

を追加。

サウンドプレイするには、
 audioSource.Play();

10.バックグラウンドミュージック

バックグラウンドミュージックは、GameControllerゲームオブジェクトに持たせるのがいいであろう。サウンドをドラッグする。

Play On AwakeとLoopの欄を有効にする

11.音量調節

Playerについている武器発射の音量を 0.5にする。

GameControllerについている背景音楽の音量を 0.5にする

12.スコア表示

新規GameObjectを追加し、Score Textと名前変更する。Add ComponentからRendering→GUIText を選ぶ

Transformのポジションを0.5,0.5,0にすると、画面中央に文字を出せる。(つまり、ビューポートは、左下を(0,0)、右上を(1,1)とする座標上に位置する。

スクリーンスペース ピクセル単位
ビューポートスペース 左下が(0,0) 右上が(1,1)

GameControllerスクリプトを開き、スコア入力の仕組みをつくる。

public GUIText scoreText;
 public int score; (publicとなっているが、実際には別のクラスからいじるので、箱として見えないほうがいい。したがって、あとでprivate
に変更する)
void UpdateScore()
 {
 scoreText.text = "Score: " + score;
 }

準備が出来たら、ゲームスタートするときと、障害物を破壊したときに、上記UpdateScore関数が動くようにする。

1) Start()関数内に

score=0;
UpdateScore();

2) GameControllerが小惑星破壊を知ることは出来ないが、小惑星そのものに、自分が破壊されたタイミングをGameController内のpublic関数に伝えることができる。

GameController関数内にpublic関数追加

public void AddScore(int newScoreValue)
{
   score += newScoreValue;
   UpdateScore();
}

小惑星プレファブを確認すると、プレイヤーが小惑星を破壊するのは、DestroyByContactスクリプトで行っている。したがって、そのスクリプトにGameControllerのAddScoreを呼ばせる。DestroyByContactスクリプトに

public int ScoreValue;

を追加しておき、GameControllerクラスの変数 gameControllerを作成する。

private GameController gameController;

その上で、破壊が起きたあとに、AddScoreを呼び出す。

gameController.AddScore(scoreValue);

また、Start()のところに、

   GameObject gameControllerObject = GameObject.FindWithTag ("GameController");
        if (gameControllerObject != null)
        {
            gameController = gameControllerObject.GetComponent <GameController>();
        }
  }

を記述する。