[Error] Photon - Fusion 2 Edit Value of INetworkStruct

qweasfjbv·2024년 7월 9일

Error

목록 보기
2/7

문제


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

0개의 댓글