

## わからないこと

キャラ移動させる際にLookRotation()でキャラの向きを指定しているのですが、立ち止まった際にZ方向へ向きを元に戻してしまいます。解決策やアイデアがありましたらお教えいただければ幸いです。

[code]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CharacterMove : MonoBehaviour {
    
        public float walkSpeed;    // 歩く速さ
        public float runSpeed;     // 走る速さ
    
        private Vector3 moveDirection = Vector3.zero; // 移動する量
        private Vector3 direction;                    // 移動する方向
        private float x;                              // horizontal
        private float z;                              // vertical
        private float gravity = 98f;                  // 下方向への移動量
        private CharacterController controller;       // character controller
    
    
    
        // Use this for initialization
        void Start () {
            // character controller 取得
            controller = GetComponent<CharacterController>();
        }
    
        // Update is called once per frame
        void Update () {
    
            // GetAxisを定義
            x = Input.GetAxis("Horizontal");
            z = Input.GetAxis("Vertical");
    
            direction = new Vector3(x, 0, z); // GetAxisから方向を取得
    
            if(Input.GetMouseButton(1)) {  // 右クリックしながら移動するとダッシュ
                moveDirection = direction * runSpeed;
            } else {
                moveDirection = direction * walkSpeed;
            }
    
    
            // 地面についていなかったら下方向に落ちる
            if(controller.isGrounded) {
                moveDirection.y = 0f;
            } else {
                moveDirection.y -= gravity * Time.deltaTime;
            }
    
            // 移動する
            controller.Move(moveDirection * Time.deltaTime);
    
            // ここが問題のよう。移動中は回転するのだが、移動し終わると元の向きに戻ってしまう。
            Quaternion q = Quaternion.LookRotation(direction);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, q, 1200.0f * Time.deltaTime);
    
    
        }
    }
    
[/code]

## 試してみたこと

  * Lookrotationの部分を変えてみる
[code]     Vector3 relativePos = target.position - transform.position;

    Quaternion rotation = Quaternion.LookRotation(relativePos);
    transform.rotation = rotation;
    
[/code]

だめでした。

  * moveDirectionを引数に入れてみる
[code]     Quaternion q = Quaternion.LookRotation(moveDirection);

    
[/code]

だめでした。

  * x, zが入力されていないとき、returnする
[code]         if(x == 0 && z == 0) {

            return;
        } else {
            direction = new Vector3(x, 0, z);
        }
    
[/code]

行けるかと思いましたが、returnしてしまうとそれ以降の処理がされないので、空中で立ち止まると落下しなくなるようになってしまいました。


CC BY-SA 4.0
2018-09-19T05:12:05.510
48533
2018-09-19T07:48:45.250
2018-09-19T07:07:32.983
30059
30059
question
c# unity3d
Character controllerで移動する際、移動する方向にキャラクターを向かせてもすぐに戻ってしまう。


returnにすると処理が止まってしまうので、if文にしました。

[code]

        if(x != 0 || z != 0) {
            direction = new Vector3(x, 0, z);
        }
    
[/code]

こうすることで、「x, z が0ではない(入力されている)ときに、direction
を更新する」という処理になり、立ち止まっていても方向がもとに戻ることなく、また、着地判定も継続して処理され、落下するようになりました。


CC BY-SA 4.0
2018-09-19T07:48:45.250
48545
2018-09-19T07:48:45.250
30059
48533
answer