//tips
//asset内animation clipの編集
Assetで導入したプレイヤーのanimationを修正する。
モデルデータの中にAnimationClipが内包されていたので、編集するためにCmd + Dで複製する。複製することでパラメーターを編集できるようになる。
Animator操作については下記も参考にした。
https://docs.unity3d.com/ja/2019.4/Manual/class-Transition.html
ただ、足の動作の部分を確認したら、その場に止まってアニメーションをループできるタイプではなく、ポジション移動を前提にアニメーションが作成されていることがわかったので、別の部分を見直して変更できないか考える。
複製したanimationclipのインスペクターでRootTransformpositionのチェックを入れることで、その場でアクションさせることができるようになった。
さらに左右の移動方向に対して顔の正面が向いていないので、rb.positionではtransform.forwardを用いる形に統一した。
//right キーで右に進む
if (Input.GetKey("right"))
{
Inverseflag = true;
animator.SetTrigger("playwalking");
Vector3 moveForward = transform.position + transform.right * 500;
moveForward.y = 0;
Debug.Log("moveForward" + moveForward);
//Quaternion targetRotation = Quaternion.LookRotation(moveForward - transform.position);
Quaternion targetRotation = Quaternion.LookRotation(moveForward);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 2*Time.deltaTime);
//transform.rotation = targetRotation;
//rb.position = transform.position + transform.right * 2.0f * Time.deltaTime;
rb.position = transform.position + transform.forward * 2.0f * Time.deltaTime;
Debug.Log(rb.position);
//MoveGo();
}
//left キーで左に進む
if (Input.GetKey("left"))
{
Inverseflag = true;
animator.SetTrigger("playwalking");
Vector3 moveForward = transform.position - transform.right * 500;
moveForward.y = 0;
Debug.Log("moveForward" + moveForward);
//Quaternion targetRotation = Quaternion.LookRotation(moveForward - transform.position);
Quaternion targetRotation = Quaternion.LookRotation(moveForward);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 2*Time.deltaTime);
//rb.position = transform.position - transform.right * 2.0f * Time.deltaTime;
rb.position = transform.position + transform.forward * 2.0f * Time.deltaTime;
//MoveGo();
}
最終的にはiosアプリにするのでスティックのドラッグ操作でのプレイヤー操作とするのでより直感的に操作できるようになる。現在はpc制作段階なので便宜上laptop上の矢印キーでの操作となっている。
アニメーションが2回発動されているように感じるので、スクリプトのデバッグで確認しておく。
if (Input.GetKey("right”))の後にデバッグを入れたら1クリックで7度も呼ばれていた。これは、void FixedUpdate()の中に入れているためでアニメーションは発動中に重ね掛けしないように変更する。
animator.SetBool("on_anim", false)を条件とし用としたがvoid型だったので、ifの条件にはできず、Animation.IsPlayingはAnimationコンポーネントでしか使えないのでphoton利用の際は使えない。
なので、GetCurrentAnimatorStateInfo(レイヤー番号).IsNameの使用を考えていく。レイヤー番号は、1番上にあるのが0番になり、ベースレイヤーとなる。この番号は作成したレイヤーをドラッグして変える事ができる。
if (!animator.GetCurrentAnimatorStateInfo(0).IsName("RabbitWalk3"))
{
Debug.Log("aaa");
animator.SetTrigger("playwalking");
}
アニメーションの現在stateでアニメーション実行中かどうかを判断するため、上記のようにコードを追加したが、状態に移行するまでに、5回ほどDebug.Log("aaa”);が呼ばれてしまい、アクションが複数回実行されてしまう。
アニメーションが別の状態へと遷移する途中ではないという条件も追加して再度確認。
if (!animator.IsInTransition(0)&&!animator.GetCurrentAnimatorStateInfo(0).IsName("RabbitWalk3"))
{
Debug.Log("aaa");
animator.SetTrigger("playwalking");
}
これにより矢印キークリック回数と同じDebug.Log("aaa”);の回数が表示され、アクションも違和感が解消された。