Fusion 2의 [Networked] 어트리뷰트를 사용하기 위해 제가 선언한 클래스들을 구조체로 바꾸던 중에 에러가 생겼습니다.
멤버 함수를 호출해서 멤버 변수의 값을 바꿔도, 바꾼 값이 적용이 안되는 문제였습니다.
해결하는 방법은 해당 글에서 해답을 찾을 수 있었습니다.
클래스는 참조 형식이지만, 구조체는 값 형식입니다.
구조체의 값을 바꾸려면 값만 바꾸는것이 아니라, 구조체를 복사하고 복사한 구조체의 값을 변경한 뒤에 다시 대입해야합니다.
// Convert RGB to RYB
[Serializable]
public struct ColorSet : INetworkStruct
{
public int r;
public int y;
public int b;
//...
public void SetColor(Color color)
{
switch (color)
{
case var _ when color.Equals(ColorConstants.RED):
r = 1; y = 0; b = 0;
break;
case var _ when color.Equals(ColorConstants.BLUE):
r = 0; y = 0; b = 1;
break;
case var _ when color.Equals(ColorConstants.YELLOW):
r = 0; y = 1; b = 0;
break;
case var _ when color.Equals(ColorConstants.ORANGE):
r = 1; y = 1; b = 0;
break;
case var _ when color.Equals(ColorConstants.GREEN):
r = 0; y = 1; b = 1;
break;
case var _ when color.Equals(ColorConstants.PURPLE):
r = 1; y = 0; b = 1;
break;
case var _ when color.Equals(ColorConstants.BLACK):
r = 1; y = 1; b = 1;
break;
case var _ when color.Equals(ColorConstants.WHITE):
r = 0; y = 0; b = 0;
break;
default:
Debug.LogError("Color Error : color can't maching ryb");
break;
}
Debug.Log("JUST AFTER SET :" + ToString());
}
// ...
}
RGB 색 체계를 간단한 RYB로 바꿔주는 구조체입니다.
[Networked] 어트리뷰트를 사용하기 위해서 INetworkStruct 를 상속받았습니다.
하지만 아래에 있는 SetColor 함수로는 r, y, b 값을 바꾸지 못합니다.
[Rpc(RpcSources.StateAuthority, RpcTargets.All)]
public void RPC_SetBoxColor(BoxDir dir, Color color)
{
int idx = DirToFaceIdx(dir);
var cSet = NetworkBoxColorset[(int)dir];
cSet.SetColor(color);
NetworkBoxColorset.Set((int)dir, cSet);
Debug.Log("AFTER SET COLOR : " + NetworkBoxColorset[(int)dir].ToString());
pbMesh.SetFaceColor(faces[idx], color);
pbMesh.ToMesh();
pbMesh.Refresh();
}
바꾸기 위해서는 임시 변수를 만들어서 할당하고 해당 변수의 값을 바꾼뒤에 다시 대입해야합니다.

JUST AFTER SET 과 AFTER SET COLOR 의 RYB값이 동일하게 출력되는 것을 확인할 수 있습니다.
https://stackoverflow.com/questions/52137926/edit-struct-value-in-unity-c-sharp