首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Unity3D,在子类中存储数据

Unity3D,在子类中存储数据
EN

Stack Overflow用户
提问于 2016-05-18 04:52:01
回答 3查看 241关注 0票数 0

在Unity3D游戏中,

我希望将数据存储在不同的子类上,所有这些子类都是从单个类Tool派生的,并且能够随意检索数据,还可以遍历每个类。

例如,一个工具是Hammer,我想要将任何锤子在关卡中使用的总次数存储在类似int timesUsed的内容中。静态属性似乎是处理这个问题的方法,但是我找不到一种方法来一次轻松地遍历Tool的所有子类并检索它们的timesUsed属性。

为了澄清,我希望Tool的每个子类都拥有timeUsed。因此,HammerDrillSaw都有独立的timesUsed属性。但是Hammer的每个实例将始终具有相同的timesUsed

另一个简短的例子是,每个锤子类(如Hammer )都有一个指向“Tool”文本框的链接。此文本框对于该类的所有实例都是相同的。

处理这个问题的正确方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2016-05-18 05:35:31

每个锤子都是它自己的实例。这就是静态属性的用武之地

不是的。在这里你不需要静电。

每个锤子都是它自己的实例。

使用List保存每个Hammer实例。

代码语言:javascript
运行
复制
public class Tool
{
    private List<Hammer> hammers;

    public Tool()
    {
        hammers = new List<Hammer>();

    }

    public void addNewHammer()
    {
        hammers.Add(new Hammer());
    }

    public void addNewHammer(int amount)
    {
        for (int i = 0; i < amount; i++)
        {
            hammers.Add(new Hammer());
        }
    }

    public void removeHammer(int index)
    {
        hammers.RemoveAt(index);
    }

    public void removeAllHammer()
    {
        hammers.Clear();
    }

    public int getRemainingNum(int index)
    {
        return hammers[index].getRemainingNum();
    }

    public Hammer getCurrentHammerInstance(int index)
    {
        return hammers[index];
    }

    public Hammer[] getAllHammerInstance()
    {
        return hammers.ToArray();
    }
}

public class Hammer
{
    private int numRemaining = 0;
    public int getRemainingNum()
    {
        return numRemaining;
    }
}

使用方法:

代码语言:javascript
运行
复制
void Start()
{
    Tool mytools = new Tool();

    //Add 1 new Hammer
    mytools.addNewHammer();

    //Add 10 Hammers
    mytools.addNewHammer(10);


    //Get numRemaining
    mytools.getRemainingNum(0);

    //Remove a Hammer by index
    mytools.removeHammer(0);

    //Remove all Hammers
    mytools.removeAllHammer();

    //Get Hammer instance
    Hammer myhammer = mytools.getCurrentHammerInstance(0);

    //Get All Hammer instance as array
    Hammer[] allHammers = mytools.getAllHammerInstance();

    //Loop through all numRemaining from each hammer
    for (int i = 0; i < allHammers.Length; i++)
    {
        Debug.Log(allHammers[i].getRemainingNum());
    }
}

重要的:您可以使用T将其转换为泛型,并能够添加其他工具。这些函数将不再锁定到Hammers,然后可以与其他工具/类一起使用。

票数 4
EN

Stack Overflow用户

发布于 2016-05-18 06:01:35

正如rudolf_franek建议的那样,创建一个管理器类来跟踪所有工具(典型的实例化对象列表)。

代码语言:javascript
运行
复制
public class Tool : MonoBehaviour
{
    public int durability;
    public string name;
}

某些工具,例如锤子:

代码语言:javascript
运行
复制
public class Hammer : Tool
{
    public void HammerAction(){...}
}

一个管理器(这可能应该是一个单例):

代码语言:javascript
运行
复制
public class ToolManager : MonoBehaviour
{
    List<Hammer> hammers;

    public int GetHammerCount()
    {
        return hammers.Count;
    }

    // other stuff like adding when instantiating etc.
}

请注意,从MonoBehaviour派生意味着您不能通过声明new Tool()来创建工具/工具的子类,而是需要像Instantiate()这样的统一方法。

c#/Unity中的属性示例( Joe Blow)

代码语言:javascript
运行
复制
private float _ordinaryMps;
public float OrdinaryMps
    {
    set {
        _ordinaryMps = value;
        foreach(BaseFrite e in all)
            e.mpsNow = _ordinaryMps * widthSpeedFactor;
        }
    get { return _ordinaryMps; }
    }

private float _mps;
public float Mps
    {
    set {
        _mps = value;
        for (int i=0; i<kParts; ++i)
            parts[i].mps = Mps;
        }
    get { return _mps; }
    }

public int Count
    {
    get { return prepped != null ? prepped.Count : 0; }
    }

private int _hearts;
public int Hearts
    {
    set {
        _hearts = value;
        controls.HeartNumber(_hearts);
        }
    get { return _hearts; }
    }

private int _megabombs;
public int Megabombs
    {
    set {
        _megabombs = value;
        controls.MegabombNumber(_megabombs);
        }
    get { return _megabombs; }
    }
票数 1
EN

Stack Overflow用户

发布于 2016-05-18 05:32:43

如果每个工具都有自己的集合,那么集合的数量就是该类型的工具的数量。

如果您将所有工具放在一个集合中,则可以通过使用.OfType()获取每个工具的计数来获得工具的数量。

如果您不打算使用集合来保存工具对象,则可以使用静态属性方法,该方法是对象的引用计数,可以在构造函数中递增,在dispose中递减。或者您可以创建一个.Use()方法或类似的方法,您不必使用IDispose。

下面是您可能正在寻找的非集合计数抽象属性方法的示例。

代码语言:javascript
运行
复制
    using System;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    namespace UnitTestProject1
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
                Hammer hammer1 = new Hammer();
                Hammer hammer2 = new Hammer();                    
                Assert.AreEqual(2, hammer1.NumRemaining);

                // Calling dispose doesn't set hammer1 null, just decrements the _numRemaining count
                hammer1.Dispose();

                Saw saw1 = new Saw();
                Saw saw2 = new Saw();
                var tools = new List<Tool> {hammer1, hammer2, saw1, saw2};

                foreach (Tool tool in tools)
                {
                    if (tool is Hammer)
                        Assert.AreEqual(1, tool.NumRemaining);
                    if (tool is Saw)
                        Assert.AreEqual(2, tool.NumRemaining);
                }
            }
        }

        public abstract class Tool
        {
            public abstract int NumRemaining { get; }
        }

        public class Hammer : Tool, IDisposable
        {
            private static int _numRemaining;

            public Hammer()
            {
                _numRemaining++;
            }

            public override int NumRemaining
            {
                get { return _numRemaining; }
            }

            public void Dispose()
            {
                _numRemaining--;
            }
        }

        public class Saw : Tool, IDisposable
        {
            private static int _numRemaining;

            public Saw()
            {
                _numRemaining++;
            }

            public override int NumRemaining
            {
                get { return _numRemaining; }
            }

            public void Dispose()
            {
                _numRemaining--;
            }
        }
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37286041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档