【问题标题】:Different sets of the same class variables within the same Monobehaviour class in c# (Unity3d)c#(Unity3d)中同一个Monobehaviour类中相同类变量的不同集合
【发布时间】:2017-09-14 07:07:40
【问题描述】:

我一直在思考这个问题,我想我可能只是缺少一种基本的编码方法来解决这个问题,但我就是想不出来。 基本上,在我的脚本中,我试图为可以在其中交换的类的“相同变量”设置不同的集合(在游戏中切换炮塔)。如果我要草拟脚本,它会是这样的:

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

...

}

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

【问题讨论】:

  • 只需创建一个struct 来保存这些值(然后有一个数组/List/随便选)

标签: c# class variables


【解决方案1】:

我是凭记忆做的,如有错误请多多包涵。

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

因此,您创建了一个基类,在本例中为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();
        }
    }        
}

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

【讨论】:

  • 是和不是。我了解您建议背后的基本方法,但是没有播放器。您只需控制可以射击的炮塔。阅读您的代码时。假设我有两个炮塔。我应该用它们的变量为每个炮塔创建一个类(保持它们相同的名称),然后将它们收集到控制器脚本中的一个数组中,让所有方法调用'currentTurret'并且它是变量?
  • 我使用Player 作为通用术语。您可以改为将Player 更改为TurretManager,并为其分配不同的炮塔。不,如果每个炮塔共享相同的变量,你不应该为每个炮塔创建一个新的类脚本,只需重复使用该脚本。
  • 哦,是的,我知道你是从哪个角度来的。相当聪明!在与项目中的其他代码争论之后,我实现并运行了它!我只是要使用一个整数来存储索引值,以确保我不会越界;)非常感谢你,伙计!我知道一定有办法做到这一点,只是想不出最后 10%。
猜你喜欢
  • 1970-01-01
  • 2017-01-17
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多