检查组件类型(2D-Roguelike源)

时间:2015-07-05 20:09:42

标签: unity3d

首先,我是Unity的新手,也是C#的新手。我正在尝试编辑玩家能够破坏墙壁的代码,以便让他能够伤害敌人。目前,我只是试图与敌人发生碰撞,做一些事情,而不仅仅是减少我的健康。以下代码试图检查我碰撞的任何类型,并采取相应的行动。如果我撞墙,它应该减少墙壁的健康。如果我碰到其他东西,它应该打印到控制台。环顾四周,我以为我应该在player.cs中做到这一点:

 protected override void OnCantMove <T> (T component)
 {

         //Set hitWall to equal the component passed in as a parameter.
         Wall hitWall = component as Wall;
         Enemy hitEnemy = component as Enemy;

     if (hitWall){
         //Call the DamageWall function of the Wall we are hitting.
         hitWall.DamageWall (wallDamage);
         //Set the attack trigger of the player's animation controller in order to play the player's attack animation.
         animator.SetTrigger ("playerChop");
     }else{
         print ("The collision is not a wall");
     }
 }

我也尝试使用if(component is Wall){...} else {...},但似乎无论我点击什么,我都无法将else语句打印到控制台。我还尝试使用else语句修改foodText.text,以防打印由于某种原因无法正常工作,但这也无效。这让我觉得碰撞不会与除了Wall之外的任何东西相互影响,但我不确定如何改变它。我知道移动使用线播来检查阻挡层,但我知道敌人也在那层上,似乎与它们相撞也不会做任何事情。

我道歉,如果我是一个白痴,我只是缺少一些超级简单的东西,或者我只是完全无能为力,但我已经花了一段时间试图解决这个问题而且它还没有找到我。< / p>

1 个答案:

答案 0 :(得分:0)

这一切看起来都很复杂。我要做的就是给玩家添加一个刚体,并向所有墙壁,敌人和玩家添加一个对撞机。然后在你的玩家脚本中添加如下内容:

void OnCollisionEnter(Collision collision) {
    string colliderTag = collision.gameObject.tag;
    if(colliderTag == "Wall") {
        collision.gameObject.SendMessage("ApplyDamage", damageToApply, SendMessageOptions.DontRequireReceiver);
    } else if(colliderTag == "Enemy") {
        ApplyDamage(damageToApplyToPlayer);
    }
}

还要确保每个墙都为其标记Wall,并为每个敌人提供标记Enemy。现在,这个脚本假设你墙上的某个地方有一个健康脚本,其中有一个名为ApplyDamage的方法,并且在你的播放器脚本中有这个方法。我假设这种方法看起来像这样:

public void ApplyDamage(float damage) {
    health -= damage;
}

因此,请确保在存储Wall运行状况时包含此项,并将其包含在player.cs中。但是,如果您有用于存储玩家健康状况的外部脚本,请将第一个代码块更改为以下内容:

void OnCollisionEnter(Collision collision) {
    string colliderTag = collision.gameObject.tag;
    if(colliderTag == "Wall") {
        collision.gameObject.SendMessage("ApplyDamage", damageToApply, SendMessageOptions.DontRequireReceiver);
    } else if(colliderTag == "Enemy") {
        gameObject.GetComponent<healthScriptName>().ApplyDamage(damageToApplyToPlayer);
    }
}

在这种情况下,您可以为播放器提供外部健康脚本,但仍然必须将其附加到播放器。