You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:34:49