c#(Unity3d)中同一个Monobehaviour类中相同类变量的不同集合

时间:2017-09-14 07:07:40

标签: c# class variables

我一直在思考这个问题已经有一段时间了,我想我可能只是缺少一个必要的基本编码方法来解决这个问题,但我想不出来。 基本上,在我的剧本中,我试图为我可以交换的类的“相同变量”设置不同的集合(切换转塔游戏)。如果我将草绘脚本,它看起来像这样:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Testturretscript : MonoBehaviour {

int ammo;
int maxAmmo;
float reloadTime;

set1(){
    ammo = set1.ammo;
    maxAmmo = set1.maxAmmo;
    reloadTime = set1.reloadTime;
}

set2()
{
    ammo = set2.ammo;
    maxAmmo = set2.maxAmmo;
    reloadTime = set2.reloadTime;
}



// Use this for initialization
void Start () {
    use set1;
}

// Update is called once per frame
void Update () {
    if (Input.GetKeyDown(KeyCode.Keypad1) || Input.GetKeyDown(KeyCode.Alpha1)){

        use set1;
    }
    if (Input.GetKeyDown(KeyCode.Keypad2) || Input.GetKeyDown(KeyCode.Alpha2)){

        use set2;
    }
}

...

}

我知道这可能听起来有点神秘,但我必须有一些简单的方法来做到这一点。因为当我来回交换时,我确实希望正确存储值而不是覆盖变量的值。

1 个答案:

答案 0 :(得分:0)

我是从记忆中做到这一点的,所以如果有一些错误就要忍受。

从你的问题来看,看起来你有多种炮塔类型,玩家可以随时切换。与携带多把枪的玩家类似的想法,他可以随时切换到。

因此,您创建了一个基类,在本例中为Turret,其中包含了一种炮塔常用的所有信息。无论它是什么类型的炮塔,所有炮塔都会有ammo计数,reloadTime等。

然后,在同一个脚本中,我们有Player类。这两个类可以在不同的文件中,但为了便于查看,我将它们合并为一个。

Player有一系列炮塔,或者他可以使用的炮塔。我们创建了一个相同类型的currentTurret变量,因此我们可以跟踪玩家当前使用的炮塔。

首先,我们使用自定义索引变量将currentTurret变量分配给我们的Turrets数组(或库存)中的第一个Turret。我们使用这个变量,因为它更易于修改和查看,而不是在任何地方使用数字。

然后,在Update中,如果我们按空格键,我们会将currentTurretIndex加1。然后我们将当前的炮塔设置为阵列中的第二个炮塔。这基本上是切换武器。警告!这只是一个例子,不要总是只增加你的索引,因为它最终会得到一个空指针异常。相反,这应该是设置当前炮塔的功能。

然后,如果我们按下W键,我们会告诉currentTurret Shoot()。因为我们已将currentTurret变量分配给阵列中的炮塔,所以只有那个炮塔会发射!万岁!

using System;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Turret
{
    public int ammo;
    public int maxAmmo;
    public float reloadTime;

    public void Shoot()
    {
        // Do some shooting stuff!
    }
}

public class Player : MonoBehaviour
{
    public Turret[] turretTypes;
    public Turret currentTurret;

    int currentTurretIndex = 0;

    void Start()
    {
        currentTurret = turretTypes[currentTurretIndex];
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Do your turret switching here.
            // For now I've just increased the turret index by 1.
            currentTurretIndex++;
            currentTurret = turretTypes[currentTurretIndex]
        }
        if (Input.GetKeyDown(KeyCode.W))
        {
            currentTurret.Shoot();
        }
    }        
}

希望这有帮助! : - )