在C#(UNITY3D)中同一单obehaviour类中的同一类变量的不同集



我已经对此进行了思考一段时间,我想我可能只是缺少一种基本的基本编码方法来解决此问题,但我只是想不到。基本上,在我的脚本中,我试图为同类的"相同变量"设置不同的集合,在此我可以在(切换炮塔Ingame)之间进行交换。如果我要绘制脚本,它看起来像这样:

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;
    }
}
...
}

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

我正在从内存中这样做,所以如果有一些错误,请忍受

从您的问题中,看来您有多种炮塔类型,玩家可以随时切换。与携带多个枪支的玩家类似的想法。

因此,您可以创建一个基类,在这种情况下,Turret包含一种类型的炮塔的所有信息。所有炮塔都将具有ammo计数,reloadTime等,无论其类型是什么类型。

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

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

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

然后,在Update中,如果我们按空格,我们将currentTurretIndex增加一个。然后,我们将目前的炮塔设置为阵列中的第二个炮塔。这基本上是切换武器。警告!例如,这只是不仅会增加索引,因为它最终会得到无效的指针例外。相反,这应该是设置当前炮塔的函数。

然后,如果我们按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();
        }
    }        
}

希望这会有所帮助!: - )

最新更新