using System.Collections; using System.Collections.Generic; using UnityEngine; namespace WildAttack { /// /// 动物类 /// public class Animal : MonoBehaviour { #region Members private Animator anim; /// /// 移动范围 /// [SerializeField] private float targetRange; private Vector3 oriPos; private Vector3 randomPoint; [SerializeField] private float idlerestSpawnTime = 0; #endregion #region Lifecycle // Start is called before the first frame update void Start() { anim = GetComponent(); oriPos = transform.localPosition; idlerestSpawnTime = Random.Range(3f, 15f); GetNewRandomTarget(); } // Update is called once per frame void Update() { // 判断死亡动画状态 if (anim.GetCurrentAnimatorStateInfo(0).IsName("Dead") && anim.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.9f) { Destroy(gameObject); } // 随机idle run float runWeight = Random.Range(0f, 1f); anim.SetFloat("run", runWeight); if (Vector3.Distance(transform.position, randomPoint) < 1f) { GetNewRandomTarget(); } else { // 判断状态 transform.LookAt(new Vector3(randomPoint.x, transform.position.y, randomPoint.z)); if (anim.GetCurrentAnimatorStateInfo(0).IsName("Run") && idlerestSpawnTime > 0) { transform.Translate(Vector3.forward * 5 * Time.deltaTime); } } // idlerest动作3~15秒随机播放一次 if (idlerestSpawnTime <= 0) { anim.SetTrigger("idlerest"); idlerestSpawnTime = Random.Range(3f, 15f); } else { idlerestSpawnTime -= Time.deltaTime; } } #endregion #region Functions public void Dead() { anim.SetTrigger("dead"); } /// /// 获取新目标点 /// void GetNewRandomTarget() { float randomX = Random.Range(-targetRange, targetRange); float randomZ = Random.Range(-targetRange, targetRange); //会根据角当前位置的一定范围进行随机移动 //Vector3 randomPint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ); randomPoint = new Vector3(oriPos.x + randomX, transform.position.y, oriPos.z + randomZ); } #endregion } }