Unity预制体生成多敌人异常:克隆体仅移动一次后停滞
地牢游戏敌人预制体克隆移动异常问题
我正在制作一款地牢游戏,这个问题已经困扰我4天了。从同一个敌人预制体创建多个敌人时,原始敌人可以正常移动并执行动作,但克隆出的敌人仅移动一次就停在原地。
enemy脚本(敌人移动、属性等逻辑)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class enemy : MonoBehaviour { [SerializeField] float health = 3; [Header("combat")] [SerializeField] float attackCD = 3f; [SerializeField] float attackRange = 1f; [SerializeField] float aggroRange = 4f; GameObject player; NavMeshAgent agent; Animator anim; float timePassed; float newDestinationCD = 0.5f; void Start() { player = GameObject.FindWithTag("Player"); agent = GetComponent<NavMeshAgent>(); anim = GetComponent<Animator>(); } void Update() { anim.SetFloat("speed", agent.velocity.magnitude / agent.speed); if (timePassed >= attackCD) { if (Vector3.Distance(player.transform.position, transform.position) <= attackRange) { anim.SetTrigger("attack"); GetComponentInChildren<enemyDamageDealer>().StartDealDamage(); timePassed = 0; } } timePassed += Time.deltaTime; if (newDestinationCD <= 0 && Vector3.Distance(player.transform.position, transform.position) <= aggroRange) { newDestinationCD = 0.5f; agent.SetDestination(player.transform.position); } newDestinationCD -= Time.deltaTime; transform.LookAt(player.transform); } void Die() { Destroy(this.gameObject); } public void TakeDamage(float damageAmount) { health -= damageAmount; anim.SetTrigger("damage"); if (health <= 0) { Die(); } } public void startDealDamage() { GetComponentInChildren<enemyDamageDealer>().StartDealDamage(); } public void endDealDamage() { GetComponentInChildren<enemyDamageDealer>().EndDealDamage(); } private void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, attackRange); Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, aggroRange); } }
enemyDamageDealer脚本(近距离攻击逻辑)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class enemyDamageDealer : MonoBehaviour { bool canDealDamage; bool hasDealtDamage; [SerializeField] float weaponLenght; [SerializeField] float weaponDamage; void Start() { canDealDamage = false; hasDealtDamage = false; } void Update() { if (canDealDamage && !hasDealtDamage) { RaycastHit hit; int layerMask = 1 << 8; if (Physics.Raycast(transform.position, -transform.up, out hit, weaponLenght, layerMask)) { if (hit.transform.TryGetComponent(out playerStats player)) { player.TakeDamage(weaponDamage); print("düşman vurdu"); hasDealtDamage = true; } } } } public void StartDealDamage() { canDealDamage = true; hasDealtDamage = false; } public void EndDealDamage() { canDealDamage = false; } private void OnDrawGizmos() { Gizmos.color = Color.yellow; Gizmos.DrawLine(transform.position, transform.position - transform.up * weaponLenght); } }
内容的提问来源于stack exchange,提问作者Scar Fia
相关产品推荐
相关产品推荐

