デジタルフロッグ

Unityのアプリの開発をしながらいろいろと忘れないための備忘録でございます。

ものすごい無理矢理JoyStickを自作してみた

f:id:karaagedigital:20160917175804g:plain

ものすごい無理矢理作ったのでJoyStickの範囲などの設定がまだできていませんが、とりあえずJoyStickらしきものが出来て、連動してキャラが動くようにはなりました。

まだまだちょっと自分でも理解があまりないので、出来るだけまとめられるようになったら再度解説の記事が書けたらと思います。

自分で1からつくるっていうのは本当に大変だと思いました…(´・ω・`)

実際に使う場合はStandard Assetsのものを使ったりする方が今のところましですな…

tsubakit1.hateblo.jp

Standard Assetsを使っての実装はこちらを参考にするととてもわかりやすいと思います。

NavMeshを使って指定した場所に移動させる方法その2

昨日に続いて今日もNavMeshについて書いていきたいと思います。

まず移動させたい床を準備して下さい。

自分は3DオブジェクトのCubeを平べったく伸ばして使いました。

f:id:karaagedigital:20160916155431p:plain

それでInspectorの右上にあるStaticですが、これにチェックを入れて下さい。

次にWindowからNavigationを選択して下さい。

f:id:karaagedigital:20160916155633p:plain

そうするとInspectorの隣の方にNavigationというタブが出てくると思います。

f:id:karaagedigital:20160916155830p:plain

ここで登れる坂の角度や、段差などの設定もできます。

とりあえず今回は平面のCubeをつかっているのでそのまま右下のBakeボタンを押しましょう。

f:id:karaagedigital:20160916160027p:plain

そうするとCube(床の方)がこんな感じで青くなります。

続いて移動させたいオブジェクトのInspectorにNavMeshコンポーネントを追加します。

f:id:karaagedigital:20160916160300p:plain

それではそのままAddComponentからScriptを追加していきます。

public GameObject Target;

void Start(){

GetComponent<NavMeshAgent>().SetDestination(Target .transform.position);

}

これを書いて保存してInspectorのTargetにTargetにしたいものをアタッチします。

f:id:karaagedigital:20160916160912p:plain

ではこれで動かしてみましょう!

f:id:karaagedigital:20160916161044g:plain

こんな感じでターゲットに向かってあるいてくれたと思います。

ちなみに・・・

f:id:karaagedigital:20160916161832g:plain

こんな感じで曲がり角があっても上り坂があってもちゃんと到着してくれます。

ちなみにターゲットの赤い棒がうにうに動いてるのはHPゲージ的なのを作っているのですが、2Dゲージなので、横から見るとペラペラになります。

なのでカメラに対して常に正面向くように設定しています。

 

NavMeshを使って指定した場所に移動させる方法その1

f:id:karaagedigital:20160916151944g:plain

NavMeshって知ってる人も多いと思いますが本当これって最初しった時はかなりびっくりというかこれは楽だなーと思った事なので、ちょっとこの事を記事にしておきたいと思います。

NavMeshはRigidbodyとはまた別で動いているので物理現象を無視して移動します。

f:id:karaagedigital:20160916153008g:plain

いやーゴジラみたいになってますね。

NavMeshの何がすごいの?

これが何をしているのかわからないという人の為に。まず奥のCubeに向かって手前のキャラクターがあるいているのはわかると思います。

まっすぐに歩いているのでNavMeshのすごさがわからないと思いますのでまずこちらをば

f:id:karaagedigital:20160916153546g:plain

二つの間にこんな感じで大きな壁を作りました。普通ならまっすぐ進んで壁にぶつかりますね

しかしこれをみて下さい!

f:id:karaagedigital:20160916153816g:plain

こんな感じで壁を避けて最短ルートで壁の向こうのCubeに到着するように移動してくるんです。

NavMeshってすごいですよねー。

この動きを使うために必要な大変なプログラミングは必要ありません。指定した位置まで最短ルートでちゃんと移動してくれます。間に穴が空いてたら穴は避けてくれますし、壁もちゃんと迂回してくれます。

GIFバンバンはるとスマホで見ると重くなっちゃうので、とりあえず詳しくはちょっと別記事で明日書きたいと思います。

positionプロパティとlocalPositionプロパティの違い

どっちもポジションを動かせるしまあどっちでも変わらないんじゃないのかと思ってしまったり、使いどころがいまいちつかめてない人もいるはず。

という事で今日はpositionとlocalPositionの違いを書いていきたいと思います。

positionとは

ポジションはワールド座標を示し、オブジェクトのポジションを変更すると指定した位置にオブジェクトは移動します。

子オブジェクトが移動したとしてもワールド座標の通りに移動するので親子関係に関係なく、指定した位置に移動する事になります。

localPositionとは

次にlocalPositionですが、こちらは親子関係にある場合に通常のtransform.positionとは違った意味合いになってきます。localPositionは親子関係の影響を受けて親オブジェクトに対しての相対的に作用しローカル座標で移動する事になります。

実際にどう違うか見てみましょう。

void Start () {
    var cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
    var cube2 = GameObject.CreatePrimitive (PrimitiveType.Cube);
    var sphere = GameObject.CreatePrimitive (PrimitiveType.Sphere);

    //cube2オブジェクトの名前をcube2に変更

    cube2.name = "cube2";
    cube.transform.parent = sphere.transform;
    cube2.transform.parent = sphere.transform;
    sphere.transform.position = new Vector3 (0, -2, 0);
    cube.transform.position = new Vector3(0,2,0);
    cube2.transform.localPosition = new Vector3(0,2,0);
}

このようにスクリプトを書いて実行してみます。

親となるsphereはy座標が-2ですが、cubeもcube2もy座標は2となっています。

それでは実行してみましょう。

f:id:karaagedigital:20160915120934p:plain

同じようにy座標は2にしたのにCubeは重ならずに等間隔に離れて表示されてました。

1つはワールド座標を軸にしてy座標を2にしたのに対して、一つはローカル座標を軸にしてy座標を2にしました。

親のy座標は-2なので、ローカル座標で移動したCubeはy座標が0の位置に、ワールド座標で移動したものはy座標2の位置に移動しています。

ワールド座標で移動したものはローカル座標であればy座標は4になります(親オブジェクトの位置が0になるので)。

 

transform.positionとtransform.localPositionとの違いはこれです。transform.positionだけでも対応は出来るけど、親子関係に基づいて移動させるものがあればワールド座標よりローカル座標で移動させた方が楽な時もありますからね。

Character ControllerでRigidbodyは使えない

Character Controllerを使っていてあれ、使えないんだ…と思ってしまったのがRigidbody。

isGroundedでなんで接地判断が出来ないんだと調べていたらRigidbodyではisGroundedは使えないという事でした…Character Controllerはとても便利ですが、こういった不便なところもありますね。

ほかのオブジェクトの影響を受ける事が出来ないので押し出されるという事も出来なかったり、isGroundedの制度があまりよくなくて斜めの位置ではisGroundedがfalseになってしまって坂道でジャンプが出来ない、とか問題はいくつかあるみたいです。

 

Rigidbodyで接地判断が出来ないCharacter ControllerはRigidbody(physix)に起因するコールバックOnCollisionEnterを受け取る事が出来ないという事です。

 

docs.unity3d.com

ちなみにisGroundedで接地判断が出来ない問題ですが、公式リファレンスのようにMoveで動かしていけば問題なくisGroundedはこちらで重力を設定してあげればちゃんと判定してくれました。

Cameraの理解を深めよう

必ず使われるCameraですが、結構Cameraは最初からあってそのままでいいじゃんっていう人も多いのではないでしょうか。

カメラって実はいろんな機能が備わっているのですが、実際その機能を上手に使いこなせてない人もいると思います。私もその中の一人なのでいったんCameraに対してちゃんと向き合ってみようと思います。

上から順にいきますが、Clear FlagsとBackgroundは飛ばしていきます。

Culling Mask

f:id:karaagedigital:20160911160317p:plain

これは二つのカメラで同じところを撮影しているのですが、片方のカメラでは二つ映っているのに対して片方は1つしか映っていません。これがCullingMaskで行える処理になります。

描写するオブジェクトのLayerにチェックを入れる事で映すものと映さないものを分ける事が出来ます。

f:id:karaagedigital:20160911160649p:plain

今回はTransparentFXというLayerのチェックを外しました。

f:id:karaagedigital:20160911160751p:plain

次に映さない方のCubeオブジェクトのLayerをTransparentFXに変更するとそのカメラではLayerがTransparentFXになっているオブジェクトは描写しなくなってしまいます。

Projection

続いてProjectionですが、こちらは遠近法を考慮したPerspective(ペースペクティブ)か、遠近法を考慮しないOrthotropic(オルソトロピック)の2つが存在します。3Dゲームか2Dゲームかを作るうえで使い分ける事が出来ます。

Perspective

f:id:karaagedigital:20160911161442p:plain

Orthotropic

f:id:karaagedigital:20160911161454p:plain

二つの違いはこんな感じです。

Field of View

このパラメータはカメラの視野角にあたるパラメーターだそうです。

f:id:karaagedigital:20160911161715g:plain

こんな感じ

Clipping Planes

これはカメラの描写の手前と奥の範囲を決める事が出来ます。ニアの数値が大きければ近いものが見えなくなりますし、ファーの数字が小さいと近くても見えなくなってしまいます。

f:id:karaagedigital:20160911162110g:plain

Viewport Rect

こちらですが、一番最初に見た写真を見てみましょう。

f:id:karaagedigital:20160911160317p:plain

Game画面が2分割されていますね。

最小が0最大が1になっていて、カメラの原点と幅と高さを指定する事が出来ます。

上の画面のものは半分ずつ描写するように設定されています。

実際に数値をいじってみて下さいね。

Depth

これはカメラの描写順序です。複数カメラがある場合は数字が小さい順に実行されます。

Rendering Path

こちらはレンダリングの方式を指定します。Use Player SetingsはPlayerの指定した設定でレンダリングされます。Vertex Litはライティングを頂点単位でやる方式で、処理不可としては軽量になるが、品質はよくないです。

3dcg.homeip.net

レンダリングについてはこちらをご覧になってみてもよいかと思います。

Target Texture

カメラが描写したものをテクスチャに描写する場合に指定します

f:id:karaagedigital:20160913110851p:plain

Render Textureを作成(Projectのところで右クリックCreateから作れます)して新規で作成したカメラのTargetTextureに突っ込んで、RendereTextureを新しく作ったCubeに突っ込みます。そうするとCubeに新しく作ったカメラの映像が映りこみます。

ライブ会場の後ろのモニターの映像みたいなものをこれで作る事が可能ですね。

他にも鏡みたいに使ったりする事も出来るのではないでしょうか。

Occlusion Culling

オクルージョンカリングは処理不可軽減の為に描写の必要がないと判断されたオブジェクトを描写しないようにする機能です。

HDR

High Dynamic Range。レンダリングを行うかどうかのチェックです。プラットフォームによっては使えないみたいです。

 

 

 

以上でカメラのInspectorの中の説明を終わりにしたいと思います(´・ω・`)

影を付ける方法

簡単な事でもど忘れするという事でぼちぼち細かい事でも残しておこうと思います。

Directional lightを設置すると全体が明るくなりますが、Inspectorを見るとNo Shadowsとなっている部分があるのでそこの設定を変更するだけでオブジェクトの影が映し出されます。

f:id:karaagedigital:20160911144722p:plain

f:id:karaagedigital:20160911144730p:plain

2種類HardとSoftがありますが違いがわかるでしょうか?影の枠がSoftの方が少しぼやけています。自然な影はどちらかと言えばSoftなほうではないでしょうか。

とりあえずこんな簡単に影を作れちゃいます。

もっとゲームをつくらねば(´・ω・`)!!