循环和增量不在unityscript中工作

问题描述 投票:-2回答:3

我遇到了命中笼功能的问题。我想在笼子越过两次之后就这样做它会被摧毁。我在顶部创建了一个变量,设置为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);
    }
}

}
unity3d 2d increment unityscript destroy
3个回答
0
投票

实际上并不需要你的循环,当某些东西进入触发器时会调用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);
    }
}

现在你的攻击类只负责找到它被击中的东西,并告诉它受到的伤害等于它的攻击伤害。

这可能会更好一点,因为它更清晰,意味着如果你有多个敌人都采取不同的行动,他们管理自己的健康,而不是你的剑类必须管理敌人的所有健康。

它还应该排除你的问题,试图在摧毁它之前减少你的笼子。


0
投票

循环不是必需的。实际上,每次调用函数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;
        }
    }
}

0
投票

你将hitCage指定为0.然后检查0是否大于2 ......它不是,所以我们不执行for循环。

© www.soinside.com 2019 - 2024. All rights reserved.