sound sepher's PASTIME

ゲーム開発で思ったことや、趣味などの話を書き綴っていきます。

【Unity】データコピーの注意点(参照型と値型について)

起きた問題と、教わった解決方法をメモ。万が一、忘れたとき用に。

起きたトラブル

  • 自作クラス型の変数に、別の変数を代入したあと、
    変数中にある公開変数の値を変更したら、元の変数の値まで変わってしまった
  • イメージ的には、ActorSkill skill = originalSkill で、skill.sp = 10 としたら、
    originalSkill.sp の値まで 10 になってしまった風味

参照型と値型の違い

  • int num = originalNum なら数値がそれぞれ別扱いになる。
    が、クラス型になると変わる。
    • Transform tr = originalTr としたあと tr.position を変えると、
      オリジナルのポジションも変わるのがまさにそれ(参照型でコピー)

解決方法

  1. クラスにコンストラクタを作って、そこにコピー元を代入できるようにしたのち、
    コンストラクタ中でそれぞれの値を移し替える。

    f:id:Ashtarte:20200901050435p:plain

  2. あとは ActorSkillOption skillOption = new ActorSkillOption(originalSkillOption);
    とすれば参照コピーではなく、新規コピーとしてインスタンスが生成される。

補足

  • その他、適宜 Clone メソッドなりを作っておくと、
    ActorSkillOption skillOption = originalSkillOption.Clone() として実行できて便利。
  • 上記のサンプルで、もしコンストラクタがない状態で Clone() するとすべての値がゼロ(何も存在しない)インスタンスが複製される。
    その場合は Clone() にコンストラクタで書いたコピー用のコードを書くこと。