[System.Serializable]
public struct CubeCoord
{
    public int q
    {
        get => m_Q;
        set
        {
            m_Q = value;
            m_S = -m_Q - m_R;
        }
    }
    public int r
    {
        get => m_R;
        set
        {
            m_R = value;
            m_Q = -m_R - m_S;
        }
    }
    public int s
    {
        get => m_S;
        set
        {
            m_S = value;
            m_R = -m_S - m_Q;
        }
    }
    [UnityEngine.SerializeField] int m_Q;
    [UnityEngine.SerializeField] int m_R;
    [UnityEngine.SerializeField] int m_S;

    public CubeCoord(int q, int r, int s)
    {
        try
        {
            if (q + r + s != 0)
                throw new System.Exception($"Invalid coordinates. The value of {nameof(s)} will be adjusted so the sum of {nameof(q)}, {nameof(r)} and {nameof(s)} values equals 0.");
        }
        catch (System.Exception)
        {
            s = -q - r;
        }

        m_Q = q;
        m_R = r;
        m_S = s;
    }
}