お久しぶりです。ひつぶです。
この春からついに高3です。
家を追い出され塾に行かされる毎日で春休み終わるの嫌だったし、
本屋に良い本があったのでUnity触ることにしました。
ゼロから始めてのんびり2週間でこのくらい行くのか、みたいな目安になればと。
また来年Unity触るときに見返せるように書こうと思います。
はじめに
期間は3/24~4/6までのぴったり2週間やったことある言語はHSPとnScriptのみ。Unity4.3、C#で。
ゼロからのスタートです。
ノートのゴミスペックPCなせいで3Dエディタみたいなものも触ったことありませんでした。
尚1日に費やす時間は長くて3時間程度です。
その1
初日と2日目。C#の書き方とUnityの基本的な使い方を。やっぱ3Dで作れるとなったらFPSっぽくしてみたくなります。
マウスの2D座標取得して前フレームとズレた分だけカメラのX軸とY軸を回転。
Z軸も一緒になってグラグラするのでフレーム毎にZ軸の回転角を0度にしてました。
今思えばInspectorからZ軸固定にしておけばよかっただけの話。
その2
3、4日目。本屋さんにあった入門書にあったボードゲームのようなものにプラスαで作りました。
本買うお金なんて無かったので見ながらじゃないので細部の処理とか違います。
3Dテキストの変更方法でGetComponentの存在を知りました。
本にはアニメーションクリップを使おうの項にありましたがアニメーションクリップ使ってません。
当たり判定・パーティクルとかハローエフェクトの再生・標準GUIの練習。
その3
5日目。地形エディタの存在を知りひたすら弄ってました。
これに限っては公式のリファレンス超分かりやすかったです。
>>Unity - Terrain Engine Overview
たぶんこの日が一番何もしてないです。
その4
6日目。また適当に地形作って標準のキャラ配置して歩き回れるようにしてみました。
カメラもSmoothFollow使いました。ザ手抜き。
今回も前回に引き続き1行もスクリプト書いてないです。
その5
このあと1週間全部。MMDモデルのLat式ミクをお借りしてきて、MMD4Mecanimを使ってUnityにインポート。
一番ゲームらしいゲームになったと思います。
カメラのキャラ追従スクリプトもちゃんと自分で書きました。。
地形は前回のを流用。
詰まったこと
・モデルのY座標が地形上で安定しない (表示上は安定)
表示上は安定するのですが、InspectorからY座標みると-10~8をすごい勢いで変化してました。
なのでカメラにつけるキャラ追従スクリプト書く際に四苦八苦。
一番時間とられました。
結局モデルのRigidbodyのIsKinematicをTrueで安定しました。
理由が分からずじまいでした。誰かご存知でしたら教えてください・・・
IsKinematicをつけるせいで爆発時に吹っ飛ぶとかが出来なくてモヤモヤ。
・敵への攻撃(プレイヤーから撃った弾の、敵側からの検出)が広い
敵の親オブジェクトとしてCube(レンダラ・コライダ付き)、
子オブジェクトとしてプレイヤー検出と起爆用にコライダをつけたオブジェクトをつけていました。
親オブジェクトからOnTriggerで検出しようとすると、
子オブジェクトも全部ひっくるめて検出するんですね。地味にこれ本に書いてない気がします。
見落としてただけかもしれませんが。
なので、攻撃検出用にもうひとつ子オブジェクトを作ることで解決。
・敵が近寄ってこない
純粋にプレイヤーとの単位ベクトル算出してtransform.positionにぶっこむ荒い方法だったので、
地形の凹凸に対応できず。
1秒おきにAddForceでY軸に力を与えて、ジャンプしてるっぽくして誤魔化しました。
・敵が2体以上近寄ってくると爆発しない
これも本とか入門サイトとかに書いてない気がします。
OnTriggerStayは、常に「一番最近Stayしてるオブジェクト」を返します。
なので、起爆用コライダにキャラが触れた後に、爆発前に敵同士でぶつかると、
Stayしてるオブジェクトはキャラからもう一つの敵に変化します。
最初起爆処理をOnTrigger内で完結しててここで引っかかりました。
キャラがStayしたらフラグをオンにして、あとはUpdate関数内で起爆処理、で解決。
・敵がジャンプするせいで判定コライダが機能しない
先述した「敵が近寄ってこない」の対策でジャンプさせると、
今度は敵自身の耐性が不安定になりコライダごとぐるぐる回転する始末。
なのでFreezeRotateionでXYZ全部固定で解決。
最初気づかなくて詰まってました。実行中もシーンビュー開くのも大切ですね。
・プレハブ生成の罠
プレハブを実体化する際、必ず最後に「as Gameobject」と付けないと取得出来ないんですよね。
型を調べてもちゃんとGameobjectとなっているのに。
ここでも結構つまづきました。
こんなところです。
あとは、C#そもそも分かってない節があったせいで、
他オブジェクトに付いているスクリプト関数を実行するのが地味に手間取りました。
戻り値欲しかったのでSendMessageでごまかすわけにもいかず。
にしても、敵5体で既にスペック的な限界を感じた時は辛かったです。(15FPSくらい)
フォロワーさんでは50体くらいまで出せる方も居たようで羨ましい限りです。
さいごに
変にC#勉強しようとしなかったのが幸いしたのか、取っ付き易く楽しかったです。
次触れるのはいつになることやらですが。
入門書も増えてますし是非。
0 コメント:
コメントを投稿