Unity、C#、指针解决方法?

Posted

技术标签:

【中文标题】Unity、C#、指针解决方法?【英文标题】:Unity, C#, pointer workaround? 【发布时间】: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,因此按值复制).. 几乎所有统一的公共类成员通常都是 属性这使得将它们“绑定”到任何东西变得更加困难 【参考方案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();
    

【讨论】:

因为这是unity3d 问题,所以Camera is a built-in class 和Color is a built-in struct @Ruzihm 当然。尽管如此,提供一个独立的示例仍然是有意义的,这样每个人都可以在不打开 Unity 的情况下尝试它。该解决方案不需要更改那些内置类或任何东西。

以上是关于Unity、C#、指针解决方法?的主要内容,如果未能解决你的问题,请参考以下文章

unity 用vs打开 js脚本 怎么没颜色?求解决方法?

[经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信[2]

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

在 C# 中从锯齿状数组转换为双指针

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法