碰撞后仅一次向用户添加点

时间:2018-06-25 03:05:49

标签: unity3d collision

所以我已经准备好创建我的第一个游戏,我刚刚完成了C#语言的课程,所以如果我使用诸如接口错误之类的东西,我深表歉意。但是,对于我的问题;我正在尝试不同的方法,并查看有效的方法。我创造了一个硬币和一个玩家。硬币按其应有的方式工作,但是有时我收钱时,它会给我两倍的积分。硬币值是15,有时当我收集硬币时,它会增加15分,而有时会增加30分。如何防止这种情况发生?

这是我的代码:

投币控制器类:

public class CoinController : MonoBehaviour, IEconomy {
    private int MoneyValue;

    void Start () {
        MoneyValue = 15;
    }

    void Update () {

    }

    void OnTriggerEnter(Collider col) {
        if (col.CompareTag("Player")) {
            Destroy(transform.gameObject);
            Value();
        }
    }

    public int Value() {
        return EconomyController.Money += MoneyValue;
    }
}

经济控制器:

public class EconomyController : MonoBehaviour{
    public static int Money;

    void Start() {
        Money = 0;
    }
}

经济界面:

public interface IEconomy {
    int Value();
}

3 个答案:

答案 0 :(得分:3)

我想指出一些有关您代码的内容:

在声明变量时的好习惯是使用lowerCamelCase:

thisIsLowerCamelCase
ThisIsNot

这是一个变量名约定,在编程中主要用于区分Methods and Classesvariables

我注意到的另一件事是您的“ Money”变量为static,并且仍在您的CoinController上进行更新。我会将这个变量设置为private int变量,并使用setter对其进行更新。考虑到这一点...您是否尝试过使用Debug.Log检查OnTriggerEnter是否在对象被销毁之前触发了两次?

简单地写:

Debug.Log ("This should only happen once!");

然后玩游戏。如果您的控制台两次显示此消息,则此触发器被调用两次。您可能会注意到的另一件事是,您在调用Value ()之后正在调用Destroy (transform.gameObject)方法。

我会做类似的事情:

public class CoinController : MonoBehaviour{

    private int moneyValue = 15;
    private EconomyController economyController;

    void Start (){
        economyController = FindObjectOfType (typeof (EconomyController)) as EconomyController;
    }

    void OnTriggerEnter (Collider col) {
        if (col.CompareTag("Player")) {
            AddValue();
        }
    }

    public int AddValue() {
        EconomyController.money += moneyValue; //Option one.
        EconomyController.AddMoney (moneyValue) ; //Option two.
        DestroyGameObject ();
    }

    private void DestroyGameObject (){
        Destroy(transform.gameObject);
    }
}

使用简洁代码原则,选项2使用的是在EconomyController类内部创建的公共void函数,用于更改私有变量。

答案 1 :(得分:0)

我的直觉告诉我,您当时可能正在收集两个硬币。我不确定您如何设置硬币,但之前也遇到过类似的问题。

想象一下蛇游戏。可以说,您已经对其进行了编程,因此,一旦吃完一个正方形,便会在随机位置创建一个新的正方形。新方块可能会出现在蛇内,因此会立即被食用。这可能就是为什么它仅在某些时间发生的原因。

答案 2 :(得分:0)

尝试在销毁对撞机之前将其禁用。 销毁游戏对象不是立即的,而且(令人讨厌的)多次触发很容易。

postid