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# 中的任何值类型都是这种情况...(Color
是struct
,因此按值复制).. 几乎所有统一的公共类成员通常都是 属性这使得将它们“绑定”到任何东西变得更加困难
【参考方案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#、指针解决方法?的主要内容,如果未能解决你的问题,请参考以下文章
[经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信[2]
100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法