【问题标题】:Unity, C#, pointer workaround?Unity、C#、指针解决方法?
【发布时间】:2022-01-17 13:14:55
【问题描述】:

我有一个 Color 类型的字段,我们称之为 objectColor。我希望 objectColor “指向”具有颜色字段的游戏对象。例如,相机的背景颜色。或者精灵渲染器的颜色。例如,当我尝试“objectColor = mainCamera.backgroundColor”时,它会复制当时的主相机背景颜色,并且没有链接。我习惯于指针和 C++。如果我在 C++ 中,我只会创建一个 Color 类型的指针,使其指向 mainCamera.backgroundColor 所指向的内容,然后以这种方式更改颜色。有什么建议吗?

【问题讨论】:

  • 保留对相机的引用并使用cam.backgroundColor
  • 想想在 c++ 中,Camera 类包含一个私有成员 _backColor,并且该类使用 get/setBackColor 函数公开它。那你怎么链接呢?
  • @shingo 和 std::bind ,或者 lambda 函数
  • c# 中的任何值类型都是这种情况...(Colorstruct,因此按值复制).. 几乎所有统一的公共类成员通常都是 属性这使得将它们“绑定”到任何东西变得更加困难

标签: c# unity3d pointers boxing


【解决方案1】:

在 C# 中没有简单的方法可以做到这一点。您可以保留对拥有Color 字段的类的引用,但这会阻止您更改不同对象类型的颜色(不确定它实际上是否不好)。或者,您可以为所有具有颜色更改功能的对象制作类包装器,并通过通用接口使用它们。

interface IColorChange {
   void SetColor(Color color);
}

class CameraWrapper : IColorChange {
   public void SetColor(Color color){
      m_camera.backgroundColor = color;
   }
}

实际上,如果你仔细想想,在 c++ 中存储成员指针也不是什么好主意。类实例随时可能死亡,您将留下一个悬空指针,无法知道它。

【讨论】:

    【解决方案2】:

    一种有点不寻常的方法(但如果记录得当,不一定是坏事)是使用“属性”。这些是在访问时自动调用其自定义 setter 和 getter 方法的变量。但是,您也无法避免单独保留对相机实例的引用。

    这里是一个与单位无关的例子:https://dotnetfiddle.net/oxBqXV

    using System;
    
    public class Camera
    {
        public int color = 20;
    }
    
    public class Foo // most likely should inherit from MonoBehavior
    {
        Camera _camera;
        public int cam_color_ptr // property
        {
            get
            {
                return _camera.color;
            } // get method
    
            set
            {
                _camera.color = value;
            } // set method
        }
    
        public void Start()
        {
            // of course you should acutally get the reference here
            // or have _camera a serializable field to assign in the editor.
            _camera = new Camera();
        }
    
        public void Print()
        {
            Console.WriteLine("The camera color is: " + cam_color_ptr);
        }
    }
    
    public class Program
    {
        public static void Main()
        {
            Foo foo = new Foo();
            foo.Start();
            foo.Print();
        }
    }
    

    【讨论】:

    • @Ruzihm 当然。尽管如此,提供一个独立的示例仍然是有意义的,这样每个人都可以在不打开 Unity 的情况下尝试它。该解决方案不需要更改那些内置类或任何东西。
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多