【问题标题】:Storing a c# reference or pointer to a Vector3 in a dynamic ExpandoObject()?将 C# 引用或指向 Vector3 的指针存储在动态 ExpandoObject() 中?
【发布时间】:2021-02-27 04:48:25
【问题描述】:

我有一个带有公共 Vector3 属性 AimTargetPos 的实例类 Player():

//Player.cs
private Vector3 aimTargetPos;
public Vector3 AimTargetPos => aimTargetPos;

在某些条件下,AimTargetPos 每帧都会更新一个新值。在另一个类中,AimTargetPos 在动态 ExpandoObject() 中按值存储为 payload.aimTargetPos,然后作为参数传递给名为 Enter(dynamic payload) 的函数。

由于Player.AimTargetPos 仍在每帧更新,payload.aimTargetPos 在创建它并传递到 Enter() 的同一帧中只会有正确的 Vector3 值。我需要能够将 aimTargetPos 分配给一个本地 ref 或指针变量,这样我就可以在第一帧之后继续使用来自有效负载的 aimTargetPos。但是,我还没有找到在动态 ExpandoObject 有效负载中存储对 Player.AimTargetPos 的引用的方法。

有一些我不想诉诸的 hacky 解决方案:

  • 创建一个新的 Transform() 来保存 Vector3 的位置,因为默认情况下,变换是通过引用传递的。
  • 与其在有效载荷 ExpandoObject 中传递引用或指针,不如每帧连续读取Player.AimTargetPos 以获得最新的位置值。这引入了我想要避免的耦合程度。

根据this question 的说法,没有一种单一的方法可以做到这一点,但听起来确实有很多选择。如果我不能在动态对象中保存引用,那么也许我可以存储Player.AimTargetPos 的地址,并在 Enter() 中接收到有效负载后使用该地址创建引用或指针?但似乎这是一种不必要的深奥方法。有没有更简单的方法来实现这一点?

【问题讨论】:

  • 为您的 Expando 提供 Player 对象并使用 ExpandoInstance.PlayerInstance.AimTargetPos 访问它。否则,另一种 hacky 方法是使用 1 长度数组,Expando.AimTargetPos[0]

标签: c# unity3d pointers dynamic expandoobject


【解决方案1】:

首先我要问,为什么需要使用 ExpandoObject?

在我使用类型化对象的经验中,99.9% 的时间都是一个非常好的解决方案(而且更简洁)。

话虽如此,您可以执行以下操作:

  1. 在返回目标的 EO 中存储一个委托成员

expando.playerTarget = (Func<Vector3>) (() => { return player.aimTarget; });

  1. 将数据包装在类对象中并改为传递它

我个人的建议是尽可能避免使用动态。

【讨论】:

  • 谢谢!这就是我最终做的。动态有什么问题?从我读过的内容来看,它们的优化非常好。我选择了动态,因为它似乎适合我的状态机。动态参数 ExpandoObject 被传递到每个状态,保存每个状态计算所需的值和引用。并且每个状态都需要非常不同的参数,因此动态参数有效负载被概括到足以被所有不同的状态使用。
  • 官方没有任何问题,我个人只是不喜欢动态并且喜欢类型化的参数。使用精心设计的类型类,几乎不可能自取其辱,但动态会增加一系列逻辑错误和 api 暴露
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2015-02-13
  • 2012-07-16
  • 2021-02-28
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多