1.経緯
3Dモデルが作れるっていうVRoidStudioを触ってキャラクターを作ったので、
Unityで動かせたらな!と思ったのがきっかけ。
完成というわけではないけど、
イメージはこんな感じ。
細かいところではイケてないところがあるので課題ですねぇ。。。
基本的には下記のサイトを参照してください!
ここでは、補足のみ記載します!
【ゼロから】VRoidで作ったキャラ(3Dモデル)をUnityで動かす(Unity編) https://miyagame.net/vroid-unity-unity/
2.キャラのインポート
VRoidStudoioでエクスポートした形式は、拡張子がvrmっていうもので、
Unityに取り込むにはUniVRMというものが必要らしいです。
UniVRM https://github.com/vrm-c/UniVRM/blob/master/README.ja.md
プロジェクトを開いておいて、ダブルクリックすれば適用された気がします。
それか、「アセット」→「パッケージをインポート」→「カスタムパッケージ」で。
いろいろ警告が出ててもエラーでなければ、
とりあえずOKかな。
あとは、vrmファイルをプロジェクトにドラッグ&ドロップしてあげればプレハブ化されます。
シーンウィンドウに放り上げてあげましょう(^^
3.キャラを動かすためのアセットをインポートしましょう
動かしたいのでコントローラーを入れていきたいですねってことで、
「ウィンドウ」→「アセットストア」!
※ウィンドウが小さかったら、ウィンドウの右上の縦3点から「最大化」しましょう。
検索ボックスに「standard assets」を入力して出てくる、
「Standard Assets (for Unity 2017.3)」を選んでください。
選択したら、「Import」を!
インポート完了したら、コンソールに警告が出ているけど、エラーも出ているはず。
こちらを解決していきましょう。
下記のサイトを参考にしてエラーを解消してください。
Unity 2019.3でのStandard Assetsのエラーへの対処方法 https://www.sbcr.jp/support/48965/
4.キャラが動けるように設定しましょう
3Dモデルを選択して、Animatorのコントローラーに「ThirdPersonAnimatorController」を設定。
3Dモデルに「コンポーネントを追加」から、左記の2つを入れていきましょう。
「Capsule Collider」はキャラクターの体系に合うように調整してください。
※あっていない場合、動かなかったりします。
5.クリック位置に移動するようにしましょう
床を静的にしてください。
「ウィンドウ」→「AI」→「ナビゲーション」を選択して、
ナビゲーションウィンドウを開いてください。
開いたら、床にベイクを設定しましょう。
左記のような水色のエリアが移動可能エリアになります。
次は、3DモデルにAgentを追加してあげます。
「コンポーネントを追加」→「ナビ メッシュ エージェント」
「速度」は3Dモデルを置き去りにしない速度を設定しましょう。
曲がり角で、ナビだけが先に行ってしまいます。
「Third Person User Control」は無効にしておきましょう。
次で作成するプログラムと命令が競合してしまうので。。。
ここまできたら、やっとプログラムを記述します。
ファイル名はMoveにでもしましょうか。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityStandardAssets.Characters.ThirdPerson; //using UnityStandardAssets.CrossPlatformInput; [RequireComponent(typeof(ThirdPersonCharacter))] public class Move : MonoBehaviour { NavMeshAgent agent; RaycastHit hit; private ThirdPersonCharacter character; private bool m_Jump; private bool crouch; private string Direction; // Start is called before the first frame update void Start() { character = GetComponent<ThirdPersonCharacter>(); agent = GetComponent<NavMeshAgent>(); agent.updatePosition = false; } // Update is called once per frame void Update() { Flick(); switch (Direction) { case "up": Debug.Log("Jump"); if (!m_Jump) { m_Jump = true; } break; case "down": //下フリックされた時の処理 crouch = true; break; case "right": //右フリックされた時の処理 break; case "left": //左フリックされた時の処理 break; case "touch": Debug.Log("touch"); //タッチされた時の処理 SetDestinationToMousePosition(); break; } if (crouch == true) { character.Move(Vector3.zero, crouch, false); agent.ResetPath(); crouch = false; } else if (agent.hasPath == true) { character.Move(agent.nextPosition - transform.position, false, m_Jump); m_Jump = false; } else { character.Move(Vector3.zero, false, m_Jump); m_Jump = false; } } void SetDestinationToMousePosition() { if (agent.pathStatus == NavMeshPathStatus.PathInvalid) { Debug.Log("NoReady"); return; } Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit)) { agent.SetDestination(hit.point); } } private Vector3 touchStartPos; private Vector3 touchEndPos; void Flick() { Direction = ""; if (Input.GetKeyDown(KeyCode.Mouse0)) { touchStartPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z); } if (Input.GetKeyUp(KeyCode.Mouse0)) { touchEndPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z); GetDirection(); } } void GetDirection() { float directionX = touchEndPos.x - touchStartPos.x; float directionY = touchEndPos.y - touchStartPos.y; if (Mathf.Abs(directionY) < Mathf.Abs(directionX)) { if (30 < directionX) { //右向きにフリック Direction = "right"; } else if (-30 > directionX) { //左向きにフリック Direction = "left"; } } else if (Mathf.Abs(directionX) < Mathf.Abs(directionY)) { if (30 < directionY) { //上向きにフリック Direction = "up"; } else if (-30 > directionY) { //下向きのフリック Direction = "down"; } } else { //タッチを検出 Direction = "touch"; } } }
フリック操作については、下記のサイトを参考にしました。
Unity-フリック操作について https://qiita.com/pilkul/items/e8864882b3f7e59b05e3
障害物はキューブなどで作り、床と同様に「Navigation Static」にしてください。
「NavigationArea」を「NotWalkable」にすることで障害物になります。
こんな感じですね。
大きさとか色は適当に設定してます。
6.その他
動く障害物などあるようなのですが、そちらについてはまた気が向いたら試してみます。
とりあえず、参考リンクのみ。
【Unity】NavMeshを学ぶ 障害物編 https://www.urablog.xyz/entry/2017/10/14/190557