ものすごい無理矢理JoyStickを自作してみた
ものすごい無理矢理作ったのでJoyStickの範囲などの設定がまだできていませんが、とりあえずJoyStickらしきものが出来て、連動してキャラが動くようにはなりました。
まだまだちょっと自分でも理解があまりないので、出来るだけまとめられるようになったら再度解説の記事が書けたらと思います。
自分で1からつくるっていうのは本当に大変だと思いました…(´・ω・`)
実際に使う場合はStandard Assetsのものを使ったりする方が今のところましですな…
Standard Assetsを使っての実装はこちらを参考にするととてもわかりやすいと思います。
NavMeshを使って指定した場所に移動させる方法その2
昨日に続いて今日もNavMeshについて書いていきたいと思います。
まず移動させたい床を準備して下さい。
自分は3DオブジェクトのCubeを平べったく伸ばして使いました。
それでInspectorの右上にあるStaticですが、これにチェックを入れて下さい。
次にWindowからNavigationを選択して下さい。
そうするとInspectorの隣の方にNavigationというタブが出てくると思います。
ここで登れる坂の角度や、段差などの設定もできます。
とりあえず今回は平面のCubeをつかっているのでそのまま右下のBakeボタンを押しましょう。
そうするとCube(床の方)がこんな感じで青くなります。
続いて移動させたいオブジェクトのInspectorにNavMeshコンポーネントを追加します。
それではそのままAddComponentからScriptを追加していきます。
public GameObject Target;
void Start(){
GetComponent<NavMeshAgent>().SetDestination(Target .transform.position);
}
これを書いて保存してInspectorのTargetにTargetにしたいものをアタッチします。
ではこれで動かしてみましょう!
こんな感じでターゲットに向かってあるいてくれたと思います。
ちなみに・・・
こんな感じで曲がり角があっても上り坂があってもちゃんと到着してくれます。
ちなみにターゲットの赤い棒がうにうに動いてるのはHPゲージ的なのを作っているのですが、2Dゲージなので、横から見るとペラペラになります。
なのでカメラに対して常に正面向くように設定しています。
NavMeshを使って指定した場所に移動させる方法その1
NavMeshって知ってる人も多いと思いますが本当これって最初しった時はかなりびっくりというかこれは楽だなーと思った事なので、ちょっとこの事を記事にしておきたいと思います。
NavMeshはRigidbodyとはまた別で動いているので物理現象を無視して移動します。
いやーゴジラみたいになってますね。
NavMeshの何がすごいの?
これが何をしているのかわからないという人の為に。まず奥のCubeに向かって手前のキャラクターがあるいているのはわかると思います。
まっすぐに歩いているのでNavMeshのすごさがわからないと思いますのでまずこちらをば
二つの間にこんな感じで大きな壁を作りました。普通ならまっすぐ進んで壁にぶつかりますね
しかしこれをみて下さい!
こんな感じで壁を避けて最短ルートで壁の向こうの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.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となっています。
それでは実行してみましょう。
同じように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を受け取る事が出来ないという事です。
ちなみにisGroundedで接地判断が出来ない問題ですが、公式リファレンスのようにMoveで動かしていけば問題なくisGroundedはこちらで重力を設定してあげればちゃんと判定してくれました。
Cameraの理解を深めよう
必ず使われるCameraですが、結構Cameraは最初からあってそのままでいいじゃんっていう人も多いのではないでしょうか。
カメラって実はいろんな機能が備わっているのですが、実際その機能を上手に使いこなせてない人もいると思います。私もその中の一人なのでいったんCameraに対してちゃんと向き合ってみようと思います。
上から順にいきますが、Clear FlagsとBackgroundは飛ばしていきます。
Culling Mask
これは二つのカメラで同じところを撮影しているのですが、片方のカメラでは二つ映っているのに対して片方は1つしか映っていません。これがCullingMaskで行える処理になります。
描写するオブジェクトのLayerにチェックを入れる事で映すものと映さないものを分ける事が出来ます。
今回はTransparentFXというLayerのチェックを外しました。
次に映さない方のCubeオブジェクトのLayerをTransparentFXに変更するとそのカメラではLayerがTransparentFXになっているオブジェクトは描写しなくなってしまいます。
Projection
続いてProjectionですが、こちらは遠近法を考慮したPerspective(ペースペクティブ)か、遠近法を考慮しないOrthotropic(オルソトロピック)の2つが存在します。3Dゲームか2Dゲームかを作るうえで使い分ける事が出来ます。
Perspective
Orthotropic
二つの違いはこんな感じです。
Field of View
このパラメータはカメラの視野角にあたるパラメーターだそうです。
こんな感じ
Clipping Planes
これはカメラの描写の手前と奥の範囲を決める事が出来ます。ニアの数値が大きければ近いものが見えなくなりますし、ファーの数字が小さいと近くても見えなくなってしまいます。
Viewport Rect
こちらですが、一番最初に見た写真を見てみましょう。
Game画面が2分割されていますね。
最小が0最大が1になっていて、カメラの原点と幅と高さを指定する事が出来ます。
上の画面のものは半分ずつ描写するように設定されています。
実際に数値をいじってみて下さいね。
Depth
これはカメラの描写順序です。複数カメラがある場合は数字が小さい順に実行されます。
Rendering Path
こちらはレンダリングの方式を指定します。Use Player SetingsはPlayerの指定した設定でレンダリングされます。Vertex Litはライティングを頂点単位でやる方式で、処理不可としては軽量になるが、品質はよくないです。
レンダリングについてはこちらをご覧になってみてもよいかと思います。
Target Texture
カメラが描写したものをテクスチャに描写する場合に指定します
Render Textureを作成(Projectのところで右クリックCreateから作れます)して新規で作成したカメラのTargetTextureに突っ込んで、RendereTextureを新しく作ったCubeに突っ込みます。そうするとCubeに新しく作ったカメラの映像が映りこみます。
ライブ会場の後ろのモニターの映像みたいなものをこれで作る事が可能ですね。
他にも鏡みたいに使ったりする事も出来るのではないでしょうか。
Occlusion Culling
オクルージョンカリングは処理不可軽減の為に描写の必要がないと判断されたオブジェクトを描写しないようにする機能です。
HDR
High Dynamic Range。レンダリングを行うかどうかのチェックです。プラットフォームによっては使えないみたいです。
以上でカメラのInspectorの中の説明を終わりにしたいと思います(´・ω・`)