Метод расширения Unity GameObject - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь добавить метод расширения к своему игровому объекту, это работает, но моя проблема в том, что GameObject имеет тот же результат. Моя цель - иметь разные результаты для каждого GameObject.

// AddExtension.cs
public static class GameObjectExtensions
{
    private static int life;
    public static int Life(this GameObject gameObject)
    {
        return life;
    }
    public static void ChangeLife(this GameObject gameObject, int numberToAdd)
    {
        life += numberToAdd;
    }
}

И в моем основном коде я хотел бы управлять GameObject следующим образом:

void Start()
{

    GameObject.Find("Perso0").ChangeLife(2);
    GameObject.Find("Perso1").ChangeLife(4);


    GameObject[] rootGOs = UnityEngine.Object.FindObjectsOfType<GameObject>();
    foreach (GameObject g in rootGOs)
    {
        if(g.name == "Perso0")
        {
            Debug.Log("Perso0 : " + g.Life());
        }
        if(g.name == "Perso1")
        {
            Debug.Log("Perso1 : " + g.Life());
        }
    }
}

Но оба GameObject имеют 6 в «Жизнь» (2 + 4) Я хотел бы получить только 2 для «Perso0» с Life и 4 с «Perso1» с Life У вас есть подсказка, чтобы помочь мне?

Спасибо и наилучшие пожелания

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Поскольку ваша переменная life равна static, это будет одно и то же значение, которое вы редактируете при каждом вызове ChangeLife для GameObject.

Поскольку методы расширения должны принадлежать до static классов, а класс static может иметь только static членов, вы не можете достичь желаемой цели с помощью методов расширения.

Даже если бы вы могли, это не правильный путь к go с парадигмой Единства. При такой настройке вы, по сути, говорите: «Каждый GameObject в моей сцене имеет значение life», что, я думаю, вы не хотите делать.

Вместо этого вы можете создавать свои собственные компоненты. , как показано ниже.

public class Enemy : MonoBehaviour
{
    [SerializeField] private int _initialHealth = 100;

    private int _health = -1;

    public int health { get { return _health; } }

    private void Awake()
    {
        _health = _initialHealth;
    }

    public void IncrementHealth(int health)
    {
        _health += health;
    }
}

Это всего лишь пример, но вы можете сделать что-то, чтобы удовлетворить ваши потребности.

0 голосов
/ 01 апреля 2020

static, примененный к члену, означает, что все экземпляры совместно используют одну копию. То есть есть только переменная одна life, которая изменяется при вызове ChangeLife() для любого объекта GameOject.
Поскольку методы расширения должны находиться в классе stati c, я не буду Я не думаю, что вы можете достичь sh того, что вы хотите, таким образом.

Однако вы должны иметь возможность добавлять пользовательские свойства для ваших игроков и других объектов в Unity. Я не помню, точно ли они называются «пользовательскими свойствами», но я знаю, что некоторые учебники по основам c, такие как Roll-a-Ball, охватывают это (или, по крайней мере, раньше).

...