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