コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】SendMessage cannot be called during Awake, CheckConsistency, or OnValidate (XXXX: OnRectTransformDimensionsChange)

はじめに

using UnityEngine;

public class Example : MonoBehaviour
{
    private void OnValidate()
    {
        Apply();
    }

    private void Apply()
    {
        var rectTransform = GetComponent<RectTransform>();

        rectTransform.sizeDelta = new Vector2
        (
            Random.Range( 0f, 100f ),
            Random.Range( 0f, 100f )
        );
    }
}

上記のようなコードを書いたら、コンパイル完了時に

SendMessage cannot be called during 
Awake, CheckConsistency, or OnValidate (XXXX: OnRectTransformDimensionsChange)

上記の警告が発生する現象に遭遇した

OnValidate から RectTransform の sizeDelta を変更したら
内部で SendMessage が使われてしまい、
「Awake・CheckConsistency・OnValidate では SendMessage は使えません」
という警告が出ているようだった

対応方法

using UnityEngine;

[ExecuteAlways] // ★
public class Example : MonoBehaviour
{
    private bool m_isApply; // ★

    private void OnValidate()
    {
        m_isApply = true; // ★
    }

    // ★
    private void Update()
    {
        if ( !m_isApply ) return;
        m_isApply = false;

        Apply();
    }

    private void Apply()
    {
        var rectTransform = GetComponent<RectTransform>();

        rectTransform.sizeDelta = new Vector2
        (
            Random.Range( 0f, 100f ),
            Random.Range( 0f, 100f )
        );
    }
}

このようなコードに書き換えたら警告が出なくなった