Related Posts Plugin for WordPress, Blogger...

4-5 Simplify Unity's ThirdPersonCharacter Class

先來重構ThirdPersonCharacter.cs,由於我們的遊戲中不會使用到跳躍跟墜落狀態,所以原先由ThirdPersonCharacter所提供的相關函式都可以刪除。往後的重構還會將ThirdPersonCharacter刪除,但現階段我們必須先進行簡化後確保遊戲可以正常執行。

大家要記得重構時不要一次改變太多,我們需要先將真正需要的功能挑選出來,後續和其他類別合併時才能順利進行。

先看看目前的ThirdPersonCharacter,有太多不需要的參數了。

以下提供重構後的ThirdPersonCharacter.cs:

using UnityEngine;

namespace UnityStandardAssets.Characters.ThirdPerson
{
 [RequireComponent(typeof(Rigidbody))]
 [RequireComponent(typeof(CapsuleCollider))]
 [RequireComponent(typeof(Animator))]
 public class ThirdPersonCharacter : MonoBehaviour
 {
  [SerializeField] float movingTurnSpeed = 360;
  [SerializeField] float stationaryTurnSpeed = 180;

  Rigidbody myRigidbody;
  Animator animator;
  float turnAmount;
  float forwardAmount;

  void Start()
  {
   animator = GetComponent();
   myRigidbody = GetComponent();

   myRigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;

   animator.applyRootMotion = true;
  }


  public void Move(Vector3 move)
  {
   // convert the world relative moveInput vector into a local-relative
   // turn amount and forward amount required to head in the desired
   // direction.
   if (move.magnitude > 1f) move.Normalize();
   move = transform.InverseTransformDirection(move);
   turnAmount = Mathf.Atan2(move.x, move.z);
   forwardAmount = move.z;

   ApplyExtraTurnRotation();

   // send input and other state parameters to the animator
   UpdateAnimator(move);
  }

  void UpdateAnimator(Vector3 move)
  {
   // update the animator parameters
   animator.SetFloat("Forward", forwardAmount, 0.1f, Time.deltaTime);
   animator.SetFloat("Turn", turnAmount, 0.1f, Time.deltaTime);

  }

  void ApplyExtraTurnRotation()
  {
   // help the character turn faster (this is in addition to root rotation in the animation)
   float turnSpeed = Mathf.Lerp(stationaryTurnSpeed, movingTurnSpeed, forwardAmount);
   transform.Rotate(0, turnAmount * turnSpeed * Time.deltaTime, 0);
  }
 }
}


Animator內的Jump可以刪除了。

JumpLeg也可以刪除。

目前的ThirdPersonCharacter.cs參數看起來簡單多了吧。

留言