【发布时间】: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 中的。
是否有可能以某种方式设置它,以便在字典中实际上不存储值,而是存储对现有变量的引用?我怎样才能存档这样的东西?
我真的有很多这样的功能,每一个小的变化都必须一个一个地应用到它们上。像我正在寻找的设置将允许我只进行一次这些更改。
编辑
我忘了提一下:在这些函数中,Vector3 和 float 的值有时也会改变,而不仅仅是 Transforms。
【问题讨论】:
-
存储非值类型而是引用类型。
-
@CodeCaster 怎么样?
-
通过将其包装在
ValueTypeContainer<T>您创建或类似的东西中。 -
对不起,我不太明白......你能给我一个简短的例子吗?这个场景的引用类型是什么?
-
你不需要字典,一个简单的方法就足以实现你想要的。检查我的答案。
标签: c# dictionary unity3d reference pass-by-reference