Unity:Objectの各パーツをバラバラに飛び散らせる方法

UnityにてObjectをばらばらにし飛び散らせる方法です。

 

タイトルがわかりにくいかもしれませんが、今回紹介する方法は例えば戦車のゲームを作るとき、

攻撃があったと同時に戦車のパーツを四方に飛び散らせてあげる時の実装方法です。

 

この演出をするのとしないのでは臨場感がだいぶ変わるので、

もし作っている方がいらっしゃいましたら是非とも実装していただきたいと思います。

 

ではさっそく解説していきたいと思います。

 

まず実装方法の1つとしてバラバラにしたいオブジェクトそれぞれをAddExplosionForce

飛ばす方法がありますが、それ以外により簡単に実装できる方法があるのでそちらを解説します。

 

その方法とはバラバラにしたいオブジェクト全てにBoxColliderをつける方法です。

この方法ではBoxColliderをつけたObject同士が弾きあい、四方八方に飛んでくれます。

 

それぞれのObjectが飛ぶ方向をしっかり指定したい場合ではこの方法は使えませんが、

ただ四方八方に飛ばしたいだけならば個人的にはいちばん簡単な方法だと思います。

 

しかしここで問題となるのはBoxColliderが干渉しそれぞれがバラバラになるなら、

ゲームを開始した時点でバラバラになってしまうということです。

 

そのための解決策は初期のゲームで使うColliderをアタッチしていないもの、

Colliderをアタッチしたバラバラになるものの2つのObjectのprefabを用意する方法です。

 

初期では前者のほうをゲーム上に配置し、ゲームが進み攻撃を受けバラバラになる

直前に後者のほうのObjectに自身を置き換えてしまいます。

 

置き換えられたObjectは次の瞬間四方に飛び散るという具合です。

 

ゲームの演出としてただ消えるのとバラバラになるのでは臨場感に差があるので、

戦闘系のゲームではどんどん実装していければいいと思います。

 

以上、UnityでObjectが攻撃されたときバラバラに飛び散らせる方法でした。

 

 

 

 

 

 

 

 

 

Unity入門:音声の使用方法(BGM,単発再生)

Unityの音声の使用方法です。

 

音声はゲームの面白さ、臨場感を左右するといっても過言ではない重要な要素です。

今日はその音声の使い方を説明したいと思います。

 

Unityでは音声を発する側、音声を聞く側という概念で

オブジェクトを分けています。

 

ですので音声をただ鳴らしただけでは音声は再生されず、

聞く側を用意しなければなりません。

 

音声を発する側はAudioSourceコンポーネントをつけ、

聞く側はAudio Listenerrコンポーネントをつけるという具合です。

また 音声自身はAudioClipといいます。

 

では基本的なことは上で述べたので、さっそく具体的な使用例を見ていきましょう。

まずは基本的なBGMを再生する方法です。

 

BGMの再生

1:まず音声を用意します。

音声についてはwav,ogg形式のものが好ましいです。mp3でも再生されますが、デメリットが多いのでお勧めしません。

wavとoggの使い分けはoggは圧縮されているため再生までに時間がかかる、一方wavは圧縮されていないため容量が大きいことがあります。

ですのでBGMのように長く使うものはogg,銃声などすぐに再生し容量が少ないものはwavをお勧めします。

 

2:音声を発する

上で述べたように音声を発するには、AudioSourceコンポーネントをつけなければなりません。

ですので発するObjectにコンポーネント->Audio->Audio Sourceを選択し、アタッチします。

 

AudioSource

 

上の画像のようにアタッチしたAudio Sourceの欄を見ると一番上にaudioclipを登録するところがあるので、

用意した音声をそこに登録します。以上で音声を発する側の設定は終わりです。

 

3:音声を聞く側を設定する

こちらは音声を聞かせたいobject(例えばゲームの主人公や、カメラ)にAudio Listenerを追加します。

コンポーネント->Audio->Audio Listenerを選択すればアタッチできます。

 

UnityではデフォルトでメインカメラにAudio Listenerがついています。

ですのでカメラで音声を拾う場合はこの手順は割愛していただいて結構です。

上の手順が終わったら再生してみましょう。しっかりBGMが再生されていたら成功です。

 

もし音が大きすぎる、小さい、または聞こえない場合は音声ファイル自体を選択し、

3Dsoundにチェックが入っていないか確認してみてください。

 

3DSoundとは音を均一でなく、距離によって大きさを変えるものです。

BGMなどはどの場所でも均一に聞こえるものなので、外してください。

うまく適切な大きさで聞こえれば成功です。

 

銃声などの単発での音声の再生

 

次に単発で音声を再生する方法です。

 

こちらは大体の場合コードでよびだすことが多いので、

ソースコードを見ていきたいと思います。

 

public AudioClip  fire;
public AudioClip  reload;

Update(){

    if(fireを再生する条件){
              audio.PlayOneShot( fire,1f );
    }
    if(reloadを再生する条件){

             audio.PlayOneShot( reload,1f );
    }

}

 

 

音声の単発での再生はaudio.PlayOneShot(AudioClip filename,float volume)を使います。

使用する音声ファイルはEditor上で、該当箇所にドラッグアンドドロップてください。

後ろの引数は再生する音量を0~1で指定します。普通の音量ならば1fを指定します。

 

条件で挟んであげれば満たしたときに再生されるので、銃を発砲した時に再生することが可能です。

 

少し長くなりましたが、実装はとても簡単です。

音声を効果的に使ってゲームをより面白くしていきたいですね。

 

以上でUnityでの音声の使用方法の解説を終わります。

Unity入門:Raycastで画面クリック、タッチでオブジェクトを操作する

Unityで特にスマフォ向けにゲームを作った時によくやることは、

タッチ入力によって対象を選択したり、操作することです。

 

それを実現するにはRaycastメソッドを使うのが一番簡単であるので、

今回はRaycastを使った方法を解説したいと思います。

 

まずRaycastについてです。

 

Raycastとは任意の位置から任意の方向に向けて架空の線を出し、

その線分上にあるオブジェクトを取得するメソッドです。

 

そのため画面のタップでオブジェクトを選択するには、タップ座標から画面奥に線をだし

オブジェクトを選択するということです。

 

次に具体的な使い方を見ていきたいと思います。

今回はマウスでクリックした対象の名前を検出する例を用いて説明したいと思います。

 

下記が名前を検出するコードになります。

if(Input.GetMouseButtonDown(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit = new RaycastHit();

            if (Physics.Raycast(ray, out hit)) {
               String selectedGameObjectname = 
                hit.collider.gameObject.name;               
               Debug.log("name="+selectedGameObjectname);
            }
}

 

上記のコードを詳しく見ていきたいと思います。

if(Input.GetMouseButtonDown(0))

マウスで左ボタンをクリックしたときに呼び出さすようにしています。

 

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

まずこここではマウスのクリックしたスクリーン座標をrayに変換しています。

Input.mousePositionがマウスのクリックした座標を取得してくれます。

 

RaycastHit hit = new RaycastHit();

 

ここはRaycast当たったオブジェクトの情報を格納するためのクラスを

作成しています。

 

Physics.Raycast(ray, out hit)

ここがRaycastの部分です。上で宣言したhit,rayを引数にとっています。

 

オブジェクトにrayが当たるとtrueを返すのでif文の中に入れることで、

オブジェクトにあたった場合の挙動を指定することができます。

 

今回は名前を検出するので、hit.collider.gameObject.name

として当たったオブジェクトの名前を取得しています。

 

注意点としては検出したいオブジェクトにはColliderをつけなければならないことです。

 

このようにRaycastを使うことで簡単にtapした位置のオブジェクトを操作できるので、

これを使ってどんどんスマフォ向けゲームを作成していきたいですね。

 

以上Raycastを使って画面クリック、タッチでオブジェクトを操作する方法でした。

 

 

 

 

 

 

 

 

 

Unity:OnTriggerEnterが呼ばれない対処法(あくまで一つのケース)

UnityでOnTriggerEnterが呼ばれない対処法です。

 

あくまで自分が体験した1つのケースの対処法であるので、設定をしなおしても

治らない可能性もありますがご了承ください。では本題に入りたいと思います。

 

先日Triggerで侵入検知設定をしたオブジェクトが範囲内に侵入した時、

呼ばれるはずのOnTriggerEnterが呼ばれないことがありました。

 

侵入をする側はColliderが設定してあり、検知側のCollideのTriggerには

しっかりとチェックが入っていたのですがなぜか発動しませんでした。

 

原因を模索しいろいろ調べ突き止めたこの現象を引き起こした原因は

侵入する側にはrigidbodyがアタッチされていなければならないということでした。

 

自分としてはcolliderが設定されていればいいと思っていたので完全に盲点でした。

対象にrigidbodyをアタッチし、再度再生したところしっかり検知してくれました。

 

この一連のことを経験し学んだことは、普段何気なく使っているものもしっかりと

その根本となる事柄をしっかり意識し、使っていかなければなければならないということです。

 

以上OnTriggerEnterが呼ばれない対処法でした。

 

 

Unity:iTweenのAn element with the same key already exists in the dictionary エラー対処法

先日iTweenを使っていた時、同じ動きをさせていたのですが下記のようなエラーが出ました。

 

ArgumentException: An element with the same key already exists in the dictionary. System.Collections.Generic.Dictionary`2[System.String,iTweenPath].Add (System.String key, .iTweenPath value) iTweenPath.OnEnable () (at Assets/Plugins/iTweenPath.cs:17)

 

このエラーは自分はスクリプトで1つのobjectを同じ動きをさせていたので、すでにキーが登録されているのに

同じ配列を同じ名前でまたHashテーブルに代入しようとしたため起こったみたいです。

 

ここでコンソールのエラー文をクリックすると、対象の部分が表示されます。

この場合上のエラー文で書いてある通りOnEnableの部分が選択されるはずです。

 

このエラーの対処法としましては、既存のOnEnable(){~}を

void OnEnable(){
if(!paths.ContainsKey(pathName)){
//paths.Add(pathName.ToLower(), this);
paths[pathName.ToLower()] = this;
}
}

 

に書き換えてあげればエラーが起こらなくなります。

自分がエラーが出た時、解決するのに時間がかかってしまったので共有しておきます。

 

以上iTweenのAn element with the same key already exists in the dictionary

エラー対処法でした。

 

 

Unity:iTweenでObjectを目的地まで動かす、複数の経路を通りながら移動する

iTweenでObjectを目的地まで動かす、複数の経路を通りながら移動する方法の解説です。

 

iTweenとはposition、scale、rotationなどのプロパティを

自由かつ簡単にアニメーションさせることができるUnityのAssetです。

 

これを使えば自由な動き物理の知識などがなくてもさせることができるので、

動きをつけるときには最強と言っても過言ではないです。

iTweenのHPはこちらから

 

まず準備としてiTweenをUnityアセットストアで検索、ダウンロードし

importをしてください。準備はこれで完了なのでとても簡単です。

 

今回の記事の題名の目的地まで動かすを実装するには、

iTweenMoveToメソッドを使います。

 

またMoveToにはHashを使う複雑に動きを指定してあげる方法

Hashを使わない簡単に動きを指定してあげる2つの実装方法があります。

 

さっそく見ていきたいと思います。まずHashを使わない方法です。

 

iTween.MoveTo(GameObject target, Vector3 position, float time)

 

targetには動かしたい対象を、positionには最終到着座標のpositionを、

timeには何秒かけて移動するかを入力します。

つまりtargetを今いる位置からpositionにtime秒かけて移動するということです。

 

また複数の地点を経由して最終到着座標に移動したい場合は、positionのところに

Vector3の配列を渡せば順番に経由してくれます

 

例えば(1f,1f,1f)->(2f,2f,2f)と移動したい場合は、

 

Vector3[] path = new Vector3[2];

Vector3 pass[0]=new Vector3(1f,1f,1f);

Vector3 pass[1]=new Vector3(2f,2f,2f);

 

とし、この配列を先ほどのpositionのところに指定すれば、順番に移動してくれます。

 

今度はHashを使う方法です。

 

iTween.MoveTo(target,iTween.Hash(“path”,path,”time”,4,”easetype”,iTween.EaseType.easeOutSine));

 

上ののようにHashで動きを指定してあげています。ここではtimeまでは上と同じです。

 

easetypeについてですが、これは動かす軌跡の曲線の種類を指定してあげるものです。

たくさんの種類があるので省略しますが、自分の理想の曲線でtargetを動かすことができます。

 

またeasetypelooptypeにしてあげ、iTween.LoopType.loopを渡すと

start~end, end~start, start~end, end~start…のように折り返しながらループします。

往復する動きを書きたい時などにとても重宝します。

 

Hashで渡すほうがより複雑に仕様を設定できますが、 よりややこしくなります。

ただ到着座標までtargetを動かしたいだけならば前者のHashを使わないほうがお勧めです。

 

以上のように本来なら複雑な処理をコードで書かなければならないところを、

iTweenを使えば簡単に実装することができます。

 

またiTweenにはビジュアルエディタという実際に動きをUnityのエディター上で作成するツールも、

無料で使うことができるのでそちらもおすすめです。

マウス操作で簡単に複雑な動きを設定することができます。

 

一応動画も載せておきます。基本的な操作がわかると思います。

 

 

 

どんどんiTweenを使って、自分の思い道理の動きを表現したいですね

以上iTweenでObjectを目的地まで動かす、複数の経路を通りながら移動する方法でした。