我有很多基本上以不同变量为参数运作的相同函数。以下是一个简短的例子:
[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);
}
}
正如您所看到的,这两个函数基本上执行完全相同的操作,只是使用不同的变量。
现在我正在寻找类似于这样的东西(假设Dictionary
可以像这样工作)
[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();
}
我曾尝试过这种方法,但发现 Dictionary
中的值并没有被更新,仍然保持着 Start()
调用时的值。所以我认为它们似乎不是通过引用而是通过值添加到 Dictionary
中的。
是否有可能设置一种方式,让 Dictionary
实际上不存储值,而是存储对现有变量的引用?我该如何实现这样的功能?
我有很多这样的函数,每个小改动都必须逐个应用。像我想要的这样的设置将允许我只为所有函数进行一次更改。
编辑
我忘了提到:在这些函数中,有时候会更改 Vector3
和 float
值,而不仅仅是 Transform
。
ValueTypeContainer<T>
中,您可以创建或类似的东西。 - CodeCaster