質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

3003閲覧

Unity5にて自作モデルでのみキャラクターが全く動かない

Feartime

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2016/06/17 02:41

5月より学校の課題でゲームのチーム製作をしており、プログラマー担当の者です。
自分たちのチームは3DTPS視点のネットワークゲームを製作しています。
少し頭を悩ませていることがありまして、
キャラクターの移動について、最初はMakeHumanで作った人体モデルを仮置きとして用意し、移動スクリプトなどを
構築しておりました。その後、方向転換でプレイヤーが人体からスライム状のキャラクターに変更になり、後ほどチームで自作したスライム状のモデル(BlenderからFBX出力したものを使用)を用意し早速Unity上に展開したのですが、
MakeHumanのモデルではCharacterControllerと移動スクリプトを付与することで空中からスポーンし、ちゃんと重力が働き、あたり判定も機能し、移動も行えたのですが、自作モデルで同様にCharacterControllerと移動スクリプトを付与すると、空中に静止したまま微動だにしないことになってしまいました。
この状態のまま動きません。
https://gyazo.com/65b7ce775be6750003d13150046405c2

なお、CharacterControllerが付与されたままRigidbodyを付与すると床を突き抜けて奈落に行ってしまいます。
スライム状モデルはMakeHumanのモデル比約3~4倍の大きさのため、
いろいろ検索を行い、Character Controllerの値などをいろいろ変えてみましたが改善されず、
何故全く動かないのか想像がつかない状態です。
分かっていることは、移動スクリプト自体は動いている(移動キーにDebug.Log()を挟んでログが出力されたため)ぐらいです。

参考になるかはわかりませんが、移動スクリプトの内容を添付しておきます。
遅くとも6月末までには完成しないといけないのでできる限り早く解決したいです。

using UnityEngine; using System.Collections; //[RequireComponent(typeof(Animator))] public class move : MonoBehaviour { private float h; private float v; private float speed; private float jumpspeed = 12f; private CharacterController controller; private Vector3 dir; Vector3 stepDirection; //追加. Vector3 deceleration; //追加 減速させる用. Vector3 moveDirection; Vector3 forward; Vector3 right; private Animator animator; private int doWalkId; float fSpeed = 10.0f; public int waitStepFlame = 10; //追加 どれぐらいの間ステップするか. public float stepCooltime = 3.0f; //追加 ステップのクールタイム. static public bool stepFlg; //追加 ステップ中かどうか. private bool canStepFlg; //追加 ステップできるかどうか. private GameObject parent; //追加プレイヤーの向き変更用. // Use this for initialization void Start () { h = 0; v = 0; speed = 15; dir = Vector3.zero; animator = GetComponent<Animator>(); doWalkId = Animator.StringToHash("Walk"); controller = gameObject.GetComponent<CharacterController>(); stepFlg = false; canStepFlg = true; parent = this.gameObject.transform.gameObject; //追加 animator.SetBool(doWalkId, false); } // Update is called once per frame void Update () { /*if (Input.GetKeyDown(KeyCode.W)) //前進ボタンを押した瞬間. { //Debug.Log(parent.name); this.transform.localEulerAngles += new Vector3(0.0f, GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y, 0.0f); //プレイヤーをカメラの角度に回転. GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); temp = GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y; }*/ if (Input.GetKey(KeyCode.W)) { Debug.Log("W key"); //var rotation = this.transform.rotation; //rotation.y = Camera.main.transform.rotation.y; //this.transform.rotation = rotation; //temp = GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y; //プレイヤーを回転するとカメラも一緒にかいてんするのでカメラを元の角度に戻す. /*if (GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y != temp) { this.transform.localEulerAngles += new Vector3(0.0f, GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y, 0.0f); //プレイヤーをカメラの角度に回転. GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); //カメラを初期化できない// temp = GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y; Debug.Log(GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y); }*/ //this.transform.localEulerAngles += new Vector3(0.0f, GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y, 0.0f); //プレイヤーをカメラの角度に回転. if (stepFlg == false) { //animator.SetBool(doWalkId, true); Move(); } //GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); //カメラを初期化できない// } else { //animator.SetBool(doWalkId, false); //GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); } /*if (Input.GetKeyUp(KeyCode.W)){ GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); }*/ if (Input.GetKey(KeyCode.F) && Input.GetKey(KeyCode.W)) { } else { } if(Input.GetKeyDown(KeyCode.LeftShift) && stepFlg == false && canStepFlg == true) { //m_LookAngleをここで初期化した方がいいかも //animator.SetBool(doWalkId, false); stepFlg = true; canStepFlg = false; if (Input.GetKey(KeyCode.W)) { Debug.Log("W key pushed"); stepDirection += Camera.main.transform.TransformDirection(Vector3.forward); deceleration += Camera.main.transform.TransformDirection(Vector3.forward); //stepDirection += new Vector3(0, 0, 1); //deceleration += new Vector3(0, 0, 1); } if (Input.GetKey(KeyCode.A)) { stepDirection += Camera.main.transform.TransformDirection(Vector3.left); deceleration += Camera.main.transform.TransformDirection(Vector3.left); //stepDirection += new Vector3(-1, 0, 0); //deceleration += new Vector3(-1, 0, 0); } if (Input.GetKey(KeyCode.S)) { stepDirection += Camera.main.transform.TransformDirection(Vector3.back); deceleration += Camera.main.transform.TransformDirection(Vector3.back); //stepDirection += new Vector3(0, 0, -1); //deceleration += new Vector3(0, 0, -1); } if (Input.GetKey(KeyCode.D)) { stepDirection += Camera.main.transform.TransformDirection(Vector3.right); deceleration += Camera.main.transform.TransformDirection(Vector3.right); //stepDirection += new Vector3(1, 0, 0); //deceleration += new Vector3(1, 0, 0); } stepDirection *= 10.0f; deceleration *= 0.05f; stepDirection.y = 0.0f; //飛び跳ねないように修正. deceleration.y = 0.0f; //飛び跳ねないように修正. //stepDirection -= Vector3.right; //stepDirection = GameObject.Find("FreeLookCameraRig").transform.localEulerAngles; //Debug.Log(stepDirection); parent.transform.localEulerAngles += new Vector3(0.0f, GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y, 0.0f); //プレイヤーをカメラの角度に回転. GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); //controller.Move(stepDirection * Time.deltaTime); StartCoroutine("Step", waitStepFlame); //stepDirection = new Vector3(0, 0, 0); //初期化 //stepFlg = false; } forward = Camera.main.transform.TransformDirection(Vector3.forward); //カメラの正面の座標を取得. right = Camera.main.transform.TransformDirection(Vector3.right); //Debug.Log(forward); moveDirection = Input.GetAxis("Horizontal") * right + Input.GetAxis("Vertical") * forward; moveDirection *= fSpeed; } void Move() { h = Input.GetAxis("Horizontal"); v = Input.GetAxis("Vertical"); if (controller.isGrounded) { dir = new Vector3(h, 0, v); dir = transform.TransformDirection(dir); dir *= speed; if (Input.GetKey(KeyCode.Space)) { dir.y = jumpspeed; } controller.Move(moveDirection * Time.deltaTime); //Debug.Log(right); transform.LookAt(transform); } } private IEnumerator Step(int num) { for (int i = 0; i < num; i++) { controller.Move(stepDirection * Time.deltaTime); stepDirection -= deceleration; //Debug.Log(stepDirection); yield return null; //Debug.Log(stepDirection); } stepDirection = new Vector3(0, 0, 0); //初期化 deceleration = new Vector3(0, 0, 0); //初期化 stepFlg = false; if (Input.GetKey(KeyCode.W)) {//前進キーを押しっぱなしだった場合. parent.transform.localEulerAngles += new Vector3(0.0f, GameObject.Find("FreeLookCameraRig").transform.localEulerAngles.y, 0.0f); //プレイヤーをカメラの角度に回転. UnityStandardAssets.Cameras.FreeLookCam.m_LookAngle = parent.transform.localEulerAngles.y; GameObject.Find("FreeLookCameraRig").transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f); } canStepFlg = false; Invoke("ChangeStepFlg", stepCooltime); } private void ChangeStepFlg() { canStepFlg = true; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CharacterControllerRigidbodyUseGravityのようなフラグはなかったはずなので、GameObjectにアタッチしているだけでは重力は発生しなかったと思います。
重力値もMove()に渡す移動値に加える必要があるはずです。

csharp

1[SerializeField] 2private float speed = 15.0f; 3 4void Update() 5{ 6 Vector3 dir = Vector3.zero; 7 8 if( controller.isGrounded ) 9 { 10 if( Input.GetKey( KeyCode.W ) ) 11 { 12 dir += Vector3.forward; 13 } 14 if( Input.GetKey( KeyCode.D ) ) 15 { 16 dir += Vector3.right; 17 } 18 if( Input.GetKey( KeyCode.S ) ) 19 { 20 dir += Vector3.back; 21 } 22 if( Input.GetKey( KeyCode.A ) ) 23 { 24 dir += Vector3.left; 25 } 26 dir *= speed; 27 } 28 29 // 重力値を加える 30 dir += Physics.gravity; 31 controller.Move( dir * Time.deltaTime ); 32}

以前使用したモデルのGameObject内にRigidbodyなどが含まれていませんでしたでしょうか。
ご確認をお願い致します。

CharacterControllerにはSimpleMove()という関数もあります。
こちらは重力計算を自動でしてくれます。
ただ、Y軸の方向への移動値を付加できなかったり、渡す値の単位が(メートル/秒)などMove()とは使い勝手が違うのでお気を付けください。

csharp

1[SerializeField] 2private float speed = 15.0f; 3 4void Update() 5{ 6 Vector3 dir = Vector3.zero; 7 8 if( controller.isGrounded ) 9 { 10 if( Input.GetKey( KeyCode.W ) ) 11 { 12 dir += Vector3.forward; 13 } 14 if( Input.GetKey( KeyCode.D ) ) 15 { 16 dir += Vector3.right; 17 } 18 if( Input.GetKey( KeyCode.S ) ) 19 { 20 dir += Vector3.back; 21 } 22 if( Input.GetKey( KeyCode.A ) ) 23 { 24 dir += Vector3.left; 25 } 26 dir *= speed; 27 } 28 29 //dir += Physics.gravity; 30 //controller.Move( dir * Time.deltaTime ); 31 controller.SimpleMove( dir ); 32}

ただ、CharacterControllerとRigidbodyを同時にアタッチすることはあまり推奨されていません。

投稿2016/06/17 22:35

urahimono

総合スコア714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Feartime

2016/06/24 07:03

うまくいきました。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問