所以我已经准备好创建我的第一个游戏,我刚刚完成了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();
}
答案 0 :(得分:3)
我想指出一些有关您代码的内容:
在声明变量时的好习惯是使用lowerCamelCase:
thisIsLowerCamelCase
ThisIsNot
这是一个变量名约定,在编程中主要用于区分Methods and Classes
与variables
。
我注意到的另一件事是您的“ 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