初めてのオリジナルTPSゲーム作成 〜はじめに〜


はじめに

2ヶ月かけて初めてのオリジナルゲームを作成しました。ウォッチドッグス2に憧れて、シューティング系のTPSゲームです。(ウォッチドッグスみたいにアクション・ハッキング・スタイルがかっこいい感じではありませんが。。。)
プレイ動画はこんな感じ。
動画:「初めてのオリジナルTPSゲーム(プレイ動画)」

TPSゲームは「カメラの動きとプレイヤーの動きの連動」が大事だなと感じたので、別記事で「カメラ編」「カメラとプレイヤー連動編」の大きく二編に分けて実装方法を解説します。
とりあえずこの記事は、ここまで。(笑)

ポートフォリオ
RESUMEにポートフォリオとして各機能を動画にしてあるので、よかったらみてください。
TPSゲーム。ウォッチドッグスに憧れて。

参照記事一覧

後々、参考にした記事と一緒に振り返りができるよう、自分用に載っけておきます。
他にも参考にした記事はたくさんありますが、作成過程でメモに残していたものをひとまず。

Animationを考慮したジャンプ(Animationの分割)
https://qiita.com/mkgask/items/fa307811da6d9d76bc97

AnimationEventを使いこなす(Animation中の任意のフレームにevent追加)
https://qiita.com/aimy-07/items/58e77d3396ded286affc

Animationの動きに合わせてColliderのパラメータ変更(AnimationCurvesの編集)
https://gametukurikata.com/program/changecollider

Colliderは内側には衝突判定なし
https://qiita.com/mechamogera/items/166f7486323e171356b4

rayを利用したキャラクターの接地判定(Physics.Linecast)
https://gametukurikata.com/program/scriptisgrounded

キャラクターが転ばないようにする(Freeze Rotation)
http://blog.livedoor.jp/f_paul/archives/27442792.html

ButtonのOnClick()以外・Button以外のuGUIでのイベント発生をScriptで実装(uGUIとEventTrigger)
https://tech.pjin.jp/blog/2017/09/03/unity_event-trigger/

uGUIのEventTriggerにて、PointerDownとPointerUpを使い「押下中(ボタン長押し)」を実装(EventTriggerに「押下中(ボタン長押し)」がないため)
https://qiita.com/netty/items/66284cbb2bb1cd42a486

オリジナルのジョイスティック(バーチャルパッド)を実装
https://kan-kikuchi.hatenablog.com/entry/uGUI_Joystick_1

Unity2Dで、三角形や四角形や円形など基本的なスプライトを利用する設定方法
https://chappyworld.hatenablog.com/entry/2018/09/23/123925

自分でインポートしたpng画像を利用する方法(特にuGUIにて)
https://teratail.com/questions/98383

Icons(シンプルなアイコンが無料ダウンロード可能)
https://material.io/resources/icons/?icon=fiber_manual_record&style=baseline

ワールド座標とローカル座標の変換
https://dkrevel.com/unity-explain/space

transform.Translateとtransform.Rotateはローカル座標系(ワールド座標系への変換も可能)
https://qiita.com/Teach/items/7fa4db3bbcfa5a2ccd50

Quaternionを数学でキチンと理解する
https://virtualcast.jp/blog/2019/11/quaternion/

Quarternionの使い方入門
https://www.sejuku.net/blog/55596

他のオブジェクトについているスクリプトの変数参照・関数実行
https://qiita.com/tsukasa_wear_parker/items/09d4bcc5af3556b9bb3a

スマホ画面の左/右半分タッチしていることを検知
http://thiqxis.hatenablog.com/entry/2018/02/13/222712

アニメーションクリップのプロパティを理解
https://xr-hub.com/archives/13007

RaycastのlayerMask設定方法(rayに衝突するObjectの設定)
https://kan-kikuchi.hatenablog.com/entry/RayCast2

RaycastとRaycastallの違い(Raycast returns the first thing hit by the ray - RaycastAll returns everything that was hit along the length of the ray.)
https://answers.unity.com/questions/429852/what-is-the-difference-between-raycast-and-raycast.html

ColliderのOnTrigerと、ベクトルの内積を用いた索敵
https://www.urablog.xyz/entry/2017/10/24/073654

数秒後に異なる処理の実行・中断や非同期のような処理を作成(Coroutine)
https://www.sejuku.net/blog/83712

UIゲージ(fillAmount、Filled)
http://makegameandmore.blog.fc2.com/blog-entry-7.html

敵キャラの自動追跡やナビゲーション(ナビゲーションシステム)
https://xr-hub.com/archives/7639

Unityエディタでの3Dモデル作成(ProBuilder)
https://xr-hub.com/archives/5463

連続的なカメラの移動 not 断続的(Vector3.Lerp())
https://qiita.com/aimy-07/items/ad0d99191da21c0adbc3

EventHandlerにてOnPointerUpを使う際の盲点(空でもOnPointerDownが実装されていないと呼ばれない)
https://qiita.com/butislime/items/24610330812580cf5eb2

Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
(FromToRotationと.normalの使い方)
https://gametukurikata.com/program/bulletmark

2つのベクトルの角度を度数法で取得する方法(内積→ラジアン→度数法)
https://qiita.com/6janazi/items/bc7613e4806f3ac8f481

Rigidbody・Colliderを使う際の、移動摩擦と回転摩擦(RigidbodyのDragとAngularDrag)
→Anngular Dragの設定をしないと衝突時に回転してしまう

Navigationを使おう
敵の移動(基本)・NavMeshのステージへの適用/NavMeshAgentをキャラに設定
https://gametukurikata.com/navigation/navigationmove
敵の移動(巡回)
https://gametukurikata.com/navigation/movetodestination

UIはコンポーネント = ScriptではTransform型で取得(GameObject型では取得不可)
https://qiita.com/MrSmart/items/76ed7dc7cb034c607721

transform.FindとgameObject.Find等々の違い(計算量が少ない実装を選択しよう!)
https://qiita.com/hkomo746/items/1988a395020e16ef0365

deltaTimeで実機のスペック問わず値を安定させるの必須
https://yumineko.com/time-deltatime/

画面のアスペクト比・解像度に合わせてUI変更(Canvasの設定)
https://pengoya.net/unity/ui-fix/

Skyboxの変更
https://miyagame.net/skybox/

mixamoでモデルのtextureがインポートされていない/適用されていないとき
https://qiita.com/HiromuKinoshita/items/351f9f00232ef0461fc5

Camera・ObjectのOcclusion Culling(カメラに写っていない部分は描画しない)
https://gametukurikata.com/basic/occlusionculling

配列とリストの違い・配列とリストの初期化方法
https://www.fenet.jp/dotnet/column/language/713/

敵の頭の上にHPバー
https://qiita.com/sakas1231/items/9acd52828204b13c93f1

Navmeshagent利用時の注意点(他コンポーネントと共に使う際)
https://docs.unity3d.com/ja/2018.4/Manual/nav-MixingComponents.html