子オブジェクトにUnity標準のカプセル型の3Dオブジェクト、親オブジェクトはPlayerという空オブジェクトになっている。
Playerにはスクリプトがアタッチされていて以下のコードになる。
public GameObject capsule;
Animator animator;
Rigidbody rd;
public float speed;
public float rotationSpeed;
// Start is called before the first frame update
void Start()
{
//capsule = transform.GetChild(0).gameObject;
animator = capsule.GetComponent<Animator>();
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
float move = Input.GetAxis("Vertical") * speed;
move *= Time.deltaTime;
float rotate = Input.GetAxis("Horizontal") * rotationSpeed;
rotationSpeed *= Time.deltaTime;
transform.Translate(new Vector3(0,0,move));
if(move != 0)
{
Debug.Log("ok");
animator.SetBool("isWalk", true);
rd.useGravity = false;
}
else
{
animator.SetBool("isWalk", false);
rd.useGravity = true;
}
}
移動するとanimatorのidleステートからwalkステートへのトランジションに設定したboolパラメーターをtrueにして、移動しないとfalseにするようにした。
walkのアニメーションではcapsuleのオブジェクトが上下に動くのでGravityがオフだとどんどん上昇して行ってしまうためidle時には宙に浮かないようrigidbodyクラスの変数であるusegravityを使って切り替えるようにした。
ジャンプモーション時にも飛んでから着地までの間だけはusegravityを適応するようにすればうまくいくような気がする。