我遇到了命中笼功能的问题。我想在笼子越过两次之后就这样做它会被摧毁。我在顶部创建了一个变量,设置为0.我尝试做+ = 1,但这也没有用。我也尝试过使用hitCage ++并对其进行调试,每次点击都保持在1。我做错了什么?
function OnTriggerEnter2D(kill:Collider2D){
enemy = GameObject.FindGameObjectWithTag("enemy");
cage = GameObject.FindGameObjectWithTag("cage");
if(kill.gameObject.tag == "enemy"){
Destroy(enemy);
Debug.Log("Dead It");
}
if(kill.gameObject.tag == "cage"){
for(hitCage = 0 ; hitCage > 2 ; hitCage++){
if(hitCage > 2){
Destroy(cage);
}
}
}
实际上并不需要你的循环,当某些东西进入触发器时会调用OnTriggerEnter2D()。在这种情况下,一旦对象进入触发器,你就会告诉你的循环四次转动。
要快速排序此问题,您应该更改:
if(kill.gameObject.tag == "cage") {
for(hitCage = 0; hitCage > 2; hitCage++) {
if(hitCage > 2) {
Destroy(cage);
}
}
}
至...(未经测试)
if(kill.gameObject.tag == "cage") {
hitCage++;
if(hitCage >= 2) {
Destroy(cage);
}
}
如果您对您似乎采用的结构进行了一些建设性的批评,请阅读以下内容。如果你正在寻找快速修复,那么不要太担心,但你可能会发现它很有用,因为你的类和对象的数量增加。
看来你正试图让这个班级管理所有的伤害和杀戮。一个更好的方法是给敌人一个健康柜台,并建立一个健康柜台。给他们两个公共函数,如“takeDamage(damage:int)”。然后你给我们的这门课可能是一颗子弹或一把剑或其他东西。这意味着你的剑(例如)会有一个名为“attackDamage”的变量。然后在你的剑类中,你将拥有这个OnTriggerEnter2D(),它可以获取进入触发器的对象,并调用像enemy.takeDamage(attackDamage)这样的东西。
然后在你的敌人或笼子里面你需要takeAamage所需要的每次受到伤害的时候检查是否会将它击倒到0健康状态。如果是这样,那么它将被销毁。
这是一些示例代码(未经测试,我通常在C#中工作,因此如果我的函数名称错误,您可能需要稍微修改一行或两行)。
您的敌人和笼子类将包含它们:
var health:int;
function Start () {
health = 1;
}
function TakeDamage(damage:int) {
//check we're not passing in a value of 0 or below
if(damage > 0) {
health = health - damage;
}
//If the enemy health is now 0
if(health <= 0) {
//Destroy the enemy
Destroy(this);
}
}
所以现在你的敌人类和笼子都有TakeDamage()函数,他们现在负责杀死自己并造成伤害。这可能更好,因为这意味着你可以有一个基类,如“AttackableEntity”,里面有TakeDamage(),然后你想要攻击的每个对象或类都会有这个(有更好的方法来构造这种继承系统)。
剑/子弹(等)类:
var attackDamage:int;
function Start() {
attackDamage = 1;
}
function OnTriggerEnter2D(collider:Collider2D) {
//get the gameObject that collided with us
var theCollidedObject:GameObject = collider.transform.gameObject;
if(theCollidedObject.gameObject.tag == "enemy") {
//Get the Enemy script attached to the gameObject so that we can use TakeDamage()
var enemy:Enemy = theCollidedObject.GetComponent<Enemy>();
//make the enemy take damage equal to this objects attackDamage
enemy.TakeDamage(attackDamage);
}
if(theCollidedObject.gameObject.tag == "cage") {
var cage:Cage = theCollidedObject.GetComponent<Cage>();
cage.TakeDamage(attackDamage);
}
}
现在你的攻击类只负责找到它被击中的东西,并告诉它受到的伤害等于它的攻击伤害。
这可能会更好一点,因为它更清晰,意味着如果你有多个敌人都采取不同的行动,他们管理自己的健康,而不是你的剑类必须管理敌人的所有健康。
它还应该排除你的问题,试图在摧毁它之前减少你的笼子。
循环不是必需的。实际上,每次调用函数hitCage
时它都会覆盖OnTriggerEnter2D
。
function OnTriggerEnter2D(kill:Collider2D) {
enemy = GameObject.FindGameObjectWithTag("enemy");
cage = GameObject.FindGameObjectWithTag("cage");
if(kill.gameObject.tag == "enemy"){
Destroy(enemy);
Debug.Log("Dead It");
}
if(kill.gameObject.tag == "cage") {
hitCage++;
if(hitCage > 2) {
Destroy(cage);
hitCage = 0;
}
}
}
你将hitCage指定为0.然后检查0是否大于2 ......它不是,所以我们不执行for循环。