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

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

ただいまの
回答率

90.51%

  • C#

    9028questions

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

  • Unity3D

    1801questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,165

Feartime

score 1

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;
    }
}

 

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

[SerializeField]
private float speed = 15.0f;

void Update()
{
    Vector3 dir = Vector3.zero;

    if( controller.isGrounded )
    {
        if( Input.GetKey( KeyCode.W ) )
        {
            dir += Vector3.forward;
        }
        if( Input.GetKey( KeyCode.D ) )
        {
            dir += Vector3.right;
        }
        if( Input.GetKey( KeyCode.S ) )
        {
            dir += Vector3.back;
        }
        if( Input.GetKey( KeyCode.A ) )
        {
            dir += Vector3.left;
        }
        dir *= speed;
    }

    // 重力値を加える
    dir += Physics.gravity;
    controller.Move( dir * Time.deltaTime );
}

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

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

[SerializeField]
private float speed = 15.0f;

void Update()
{
    Vector3 dir = Vector3.zero;

    if( controller.isGrounded )
    {
        if( Input.GetKey( KeyCode.W ) )
        {
            dir += Vector3.forward;
        }
        if( Input.GetKey( KeyCode.D ) )
        {
            dir += Vector3.right;
        }
        if( Input.GetKey( KeyCode.S ) )
        {
            dir += Vector3.back;
        }
        if( Input.GetKey( KeyCode.A ) )
        {
            dir += Vector3.left;
        }
        dir *= speed;
    }

    //dir += Physics.gravity;
    //controller.Move( dir * Time.deltaTime );
    controller.SimpleMove( dir );
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/24 16:03

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

    キャンセル

同じタグがついた質問を見る

  • C#

    9028questions

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

  • Unity3D

    1801questions

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