Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D:当敌人(克隆人)被击中时,原来的预制敌人受到伤害,而不是克隆人?_C#_Unity3d - Fatal编程技术网

C# Unity3D:当敌人(克隆人)被击中时,原来的预制敌人受到伤害,而不是克隆人?

C# Unity3D:当敌人(克隆人)被击中时,原来的预制敌人受到伤害,而不是克隆人?,c#,unity3d,C#,Unity3d,克隆使用EnemyHealth脚本生成,在脚本中设置其运行状况参数。此脚本中有一个名为TakeDamage()的函数。我唯一的猜测是,我没有明确定义哪个敌人需要在TakeDamage()中消耗生命值,但我很难理解这一点,因为每个克隆人都有自己的生命值,当武器与敌人碰撞时,TakeDamage()会从我的PlayerTack脚本中调用,所以我认为这只会发生在相撞的敌人身上。但是我想我需要一个明确的方式来让TakeDamage()只影响与碰撞有关的敌人 我是自学成才的,所以如果这是一个简单或糟糕的问

克隆使用EnemyHealth脚本生成,在脚本中设置其运行状况参数。此脚本中有一个名为TakeDamage()的函数。我唯一的猜测是,我没有明确定义哪个敌人需要在TakeDamage()中消耗生命值,但我很难理解这一点,因为每个克隆人都有自己的生命值,当武器与敌人碰撞时,TakeDamage()会从我的PlayerTack脚本中调用,所以我认为这只会发生在相撞的敌人身上。但是我想我需要一个明确的方式来让TakeDamage()只影响与碰撞有关的敌人

我是自学成才的,所以如果这是一个简单或糟糕的问题,我道歉。我已经找了好几天了,所以我希望有人能帮我


EnemyHealth脚本:
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共卫生:单一行为
{
public int enemyMaxHealth=100;
公共卫生;
公共健康吧enemyHealthBar;
//在第一帧更新之前调用Start
void Start()
{
enemyCurrentHealth=enemyMaxHealth;
enemyHealthBar.SetMaxHealth(enemyMaxHealth);
}
//每帧调用一次更新
无效更新()
{
}
公害
{
enemyCurrentHealth-=25;
enemyHealthBar.SetHealth(enemyCurrentHealth);
如果(enemyCurrentHealth==0)
{
摧毁(这个游戏对象);
//需要死亡动画
}
}
}
Playeratack脚本:

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类剧目:单一行为
{
公共卫生;
公共动画师;
公共层屏蔽层;
公共bool allowDamage=false;
//在第一帧更新之前调用Start
void Start()
{
}
//每帧调用一次更新
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
点击攻击();
}
}
私有void AnimationCheck()
{
if(animator.GetCurrentAnimatorStateInfo(0.IsName(“Stab”))
{
allowDamage=true;
}
其他的
{
allowDamage=false;
}
}
私有无效点击攻击()
{
设置触发器(“攻击”);
}
无效碰撞中心(碰撞)
{
if(collision.gameObject.CompareTag(“敌人”))
{
动画检查();
如果(allowDamage==true)
{
enemyHealth.TakeDamage();
}
}
}
}
Unity场景截图:


蓝色标记的克隆人是被击中的人,黄色标记的敌人是当其他敌人被击中时受到伤害的原始敌人。

只有一个敌人受到伤害的原因是因为你引用了一个敌人的生命组件。无论你在inspector中为你的
enemyHealth
变量指定了什么敌人,都会受到伤害

从PlayerTack类中删除enemyHealth变量

在碰撞函数内部,您将从与之碰撞的对象获取enemyHealth

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        AnimationCheck();

        if (allowDamage)
        {
            var enemyHealth = collision.gameObject.GetComponent<EnemyHealth>();
            if (enemyHealth)
            {
                enemyHealth.TakeDamage();
            }
        }
    }
}
void OnCollisionEnter(碰撞)
{
if(collision.gameObject.CompareTag(“敌人”))
{
动画检查();
如果(允许损坏)
{
var enemyHealth=collision.gameObject.GetComponent();
if(enemyHealth)
{
enemyHealth.TakeDamage();
}
}
}
}

如果只有敌人才会有EnemyHealth脚本(听起来是这样的),那么就有可能去掉CompareTag行。然后,您只需检查您碰撞的游戏对象是否具有该脚本即可知道它是敌人。

我猜您在Unity Inspector中将原始(未克隆)敌人指定为
PlayerAttack.enemyHealth
的值。在OnCollisionCenter中,你总是在伤害特定的敌人,不管你实际击中了哪个敌人。你需要找出哪一个敌人实际上被击中了,然后打电话给该敌人
TakeDamage
。你可以通过使用
Collision.gameObject
Hmm的值来实现这一点,谢谢!!!这听起来好像能解决我的问题。我跟得很好,我很难理解。一旦我有机会测试它,我会把它标记为完成,我真的很感激答案!是的,成功了!我没有太多的实践将变量设置为这样的事件来访问其他脚本。这是非常有用的,我有一种感觉,我会做很多。再次感谢!