首先,我是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>
答案 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);
}
}
在这种情况下,您可以为播放器提供外部健康脚本,但仍然必须将其附加到播放器。