【问题标题】:(How) Can I make a Dictionary for variable references?(如何)我可以为变量引用制作字典吗?
【发布时间】:2018-04-21 01:57:24
【问题描述】:

我有很多函数的工作方式基本相同,只是使用不同的变量。简短示例:

[SyncVar] private Vector3 syncedPlayerPosition;
[SyncVar] private Vector3 syncedHandPosition;

private Transform playerTransform;
private Transform handTransform;

private float lerpPlayerPositionRate;
private float lerpHandPositionRate;

void SetPlayerPosition(){

    if(playerTransform.position != syncedPlayerPosition){
        playerTransform.position = Vector3.Lerp(playerTransform.position, syncedPlayerPosition, Time.deltaTime * lerpPlayerPositionRate);
    }
}

void SetHandPosition(){

    if(handTransform.position != syncedHandPosition){
        handTransform.position = Vector3.Lerp(handTransform.position, syncedHandPosition, Time.deltaTime * lerpHandPositionRate);
    }
}

如您所见,这两个函数的功能基本完全相同,只是使用了不同的变量。

现在我正在寻找这样的东西(假设Dictionarys 会这样工作)

[SyncVar] private Vector3 syncedPlayerPosition;
[SyncVar] private Vector3 syncedHandPosition;

private Transform playerTransform;
private Transform handTransform;

private float lerpPlayerPositionRate;
private float lerpHandPositionRate;

/* Add Dictionaries to reference those variables */
private Dictionary<Transform,Vector3> positionDict = new Dictionary<Transform,Vector3>();
private Dictionary<Transform,float> lerpRateDict = new Dictionary<Transform,float>();

private void Start(){
    /* Fill the Dictionaries with Links between the Transforms
     * to the achording variable reference */

    /* Until now not the references are linked but rather values written */
    positionDict.Add(playerTransform, syncedPlayerPosition);
    positionDict.Add(handTransform, syncedHandPosition);

    lerpRateDict.Add(playerTransform, lerpPlayerPositionRate);
    lerpRateDict.Add(handTransform, lerpHandPositionRate);
}

/* Than I could use (and change) only one common function for both e.g like */
void SetPosition(Transform transform){

    if(transform.position != positionDict[transform]){
        transform.position = Vector3.Lerp(transform.position, positionDict[transform], Time.deltaTime * lerpRateDict[transform]);
    }

    /* Add this only as example that also this has to be posible */
    lerpRateDict[transform] += 1;
    positionDict[transform] = Vector3.zero(); 
}

我实际上尝试过这种方式,但意识到Dictionarys 中的值不会更新,而是在调用Start() 时保持它们的位置。所以在我看来,它们不是由Reference 而是由Value 添加到Dictionarys 中的。

是否有可能以某种方式设置它,以便在字典中实际上不存储值,而是存储对现有变量的引用?我怎样才能存档这样的东西?

我真的有很多这样的功能,每一个小的变化都必须一个一个地应用到它们上。像我正在寻找的设置将允许我只进行一次这些更改。

编辑
我忘了提一下:在这些函数中,Vector3float 的值有时也会改变,而不仅仅是 Transforms。

【问题讨论】:

  • 存储非值类型而是引用类型。
  • @CodeCaster 怎么样?
  • 通过将其包装在 ValueTypeContainer&lt;T&gt; 您创建或类似的东西中。
  • 对不起,我不太明白......你能给我一个简短的例子吗?这个场景的引用类型是什么?
  • 你不需要字典,一个简单的方法就足以实现你想要的。检查我的答案。

标签: c# dictionary unity3d reference pass-by-reference


【解决方案1】:

为什么不创建一个可以为所有转换调用的方法:

void SyncPositions(Transform thisTransform, Vector3 targetPosion, float rate)
{
    if (thisTransform.position != targetPosion)
    {
        thisTransform.position = Vector3.Lerp(thisTransform.position, targetPosion, Time.deltaTime * rate);
    }
}

你可以调用它来进行玩家变换或手部变换。

SyncPosition(playerTransform,syncedPlayerPosition,lerpPlayerPositionRate);
SyncPosition(handTransform,syncedHandPosition,lerpHandPositionRate);

希望对你有帮助

【讨论】:

  • 这比一个怪异的字典概念更有意义。名称告诉动作,参数告诉演员。很简单。
  • 您好,抱歉,这还不够。我没有提到这一点,但在这些函数中,Vector3float 的值也可能会发生变化......这种方法不可能做到这一点。
  • @derHugo 你想改变 SetPosition() 中作为参数传递的值吗?
  • @UmairM 是的,这可能是一个起点。我稍微编辑了我的问题,所以你可以看到我有时也想设置这些值。
  • 使用 ref 或 out 关键字。它们就像指向值的指针一样工作,并允许在方法内更改它们,同时影响作为参数传递的原始值。不要考虑在那里打拳击。坚持什么是最有效的,拳击很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2011-10-14
  • 1970-01-01
  • 2019-06-15
  • 2022-01-25
相关资源
最近更新 更多