我一直在思考这个问题已经有一段时间了,我想我可能只是缺少一个必要的基本编码方法来解决这个问题,但我想不出来。 基本上,在我的剧本中,我试图为我可以交换的类的“相同变量”设置不同的集合(切换转塔游戏)。如果我将草绘脚本,它看起来像这样:
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;
}
}
...
}
我知道这可能听起来有点神秘,但我必须有一些简单的方法来做到这一点。因为当我来回交换时,我确实希望正确存储值而不是覆盖变量的值。
答案 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();
}
}
}
希望这有帮助! : - )