スキップしてメイン コンテンツに移動

一つの方法でシンプルにプログラミングしたら余計面倒なパターンの話

 Unity エディタではゲームを編集する Edit Mode とテストプレイをする Play Mode が実行できます。

自作コンポーネントのメンバ変数の値は Inspector ウィンドウに表示されるフィールドでそれぞれ編集できたり、ゲーム実行時にスクリプトから変更することが想定できます。

Edit Mode でも Play Mode でもメンバ変数の値が変更されたことを検知する方法として、プロパティと OnValidate を組み合わせる検証を行ったので、今回はそういう風に検知できるよというひとつのパターンを紹介します。

ランタイム時に変更を受け取る方法

プロパティの setter で処理します。
Edit Mode では private であっても SerializeField ならばメンバ変数を直接変更するため、setter は呼ばれませんが、前述の OnValidate が呼ばれるので、そこでイベント処理を行います。

OnValidate は Inspector からの編集時

プロパティの setter で全て処理したいと思ってしまったため視野が狭くなっていたので、その備忘録のようなものなのですが、 Inspector ウィンドウのフィールドからの編集は SerializeProperty を用いるため getter, setter のプロパティではなく実体を持つ変数が直接変更されます。

そのため、プロパティの setter は呼び出されません。ここで、メンバ変数ではなくそのプロパティを SerializeProperty に渡せないかと迷走してしまいました。

2つの機能を組み合わせたほうがシンプルなときもある

考えてみたら、外部スクリプトから変更される際はプロパティ経由なので setter を用い、 Inspector ウィンドウ経由ならば OnValidate を用い、どちらからも同じ関数を呼び出せば、問題ないであろうことに気づきました。

これは、当たり前と思う人には、当たり前のことです。
だけど、視野が狭くなり、全てプロパティの setter 経由で値を変更させる方法を調べないとと思い込んでしまうと意外と抜け出しづらいかもしれません。

今回は運よく、プロパティと OnValidate どちらもトリガーとすれば良いことに気づけましたが、迷走しているときは意外に気づかないかもしれません。

コメント

このブログの人気の投稿

QTableView で表を表示してみる

タイトルは駄洒落を狙っているわけではありません。 こんばんわ SakuraCrowd です。 今回は今作っているソフトの経過報告です。 最近のブログのパターンは、 「XXX作ったよ。これがスクリーンショットね。あとこんなこと思ったよ。」 という流れですが、 今日はできていないソフトの部分的な話なので、 いつもよりもプログラムちっくな話になると思います。(´Ծ_Ծ´)メガネノトキハマジメブッテル QTableView は GUIライブラリ Qt のクラスです。 それを Python で使うための PySide というライブラリを使っています。 某表計算ソフト っぽい表の GUI です。 このデータの日付が 09/01 なのでおそらくその日に   QTableView 使うぞ!(`・ω・´) とサンプルデータを作ったのでしょう。 Qt Designer という GUI エディタを使うとポトペタでウィンドウを設計できます。 選択できる GUI の中に QTableView と QTableWidget があります。 どちらも上のような表の GUI です。 QTableWidget は 簡単 に値をいれたりできます。 Qt Designer 上で直接編集 することができるので、 サンプルの表を簡単に作ることができます。 それに対して、 QTableView は Qt Designer 上では値を編集できません。たぶん。 QTableView の強みは MVC の構造 を使えることです。 名前のとおり QTableView は View です。 これにデータを管理している Model オブジェクトを設定して使います。 Model クラスを作る手間がかかりますが、 GUI の細かな操作をしなくても Model に応じた表を表示してくれます。 Model は QAbstractTableModel を 継承 して作ります。 コンストラクタで基底クラスの処理を呼び出し、いくつかの純粋仮想関数をオーバーライドします。 def __init__ ( self , parent= None , *args):...

GrimDawn クロンリーの幹部という名もなき賞金首

 賞金首を倒すのは、短時間で何か達成するにはちょうどいいミッションだ。 今までのバウンティのクエストには、ターゲットのいる場所などが書かれていたのだが、今回はクロンリーの幹部3人を倒せというもの。 今までは、賞金首に名前があったが、幹部3人という表現は何なのだろうと思った。 3人もいるから文章を短縮するために名前を端折ったのか。 それに場所も書かれていないので、ウィキを見たのだけど、よくわからなかったので、とりあえずクロンリーの隠れ家にリフトで移動した。 クロンリーの隠れ家の入り口あたり 隠れ家周辺の可能性もあるけど、クリスタルを埋め込まれたということは、かなりクロンリーの近くにいる気がする。 クロンリーの隠れ家には数体、 HP バーの左右にドクロマークがついているヒーロークラス のやつらがいるので、そいつらのことかもしれないと思った。 一番上にマーティンとか名前がついてるから幹部かなと期待したけど違った そして、マーティン(幹部かなと思ってた)と戦っていたら、いきなり、幹部を倒したというメッセージ。 マーティンは幹部じゃなかったし、いつ幹部をやったかは不明 どうやら、よく見るとたまに MOB っぽい敵の中に幹部と書かれている敵がいるのでそいつらを3体やればよいということらしい。 道中でいつの間にか幹部を3体倒してミッションもクリアしたので、ついでにクロンリーを倒してきた(まだやられそうになりながらだけど、たまに逃げたりしながら時間を数分かければ勝てる)。 クロンリーの隠れ家のマーティンのように名前もなく、「幹部」という肩書だけのMOB。 幹部はもちろん それなりに偉いんだろうけど 、名前もなく、いつの間にかやられるところに、 むなしさを感じた賞金首たち だった。 名前は大事だな。あと雑魚と一緒にしなない程度のタフさがあればよかったのかなと思う。 そろそろストーリーをすすめたいが、いろいろあって、短時間しかできない。 あと、いい装備がでてこなくなってきたのでモチベーションが下がり気味なこともある。 飽きる前に、 Act4 まではすすめたい。 つづく

和風狩ゲー「WildHearts」プレイ日誌(ツイートまとめ)

幻想的な和風のおとぎ話の世界のような雰囲気で始まる、カラクリで戦略が広がる狩ゲー 「 Wild Hearts 」のプレイ感想(主にツイート)のまとめです。 通常価格は1万円近くしますが、Steam のスプリングセールで 85 % オフの 1, 455 円で購入しました。 カラクリは思ったより全然簡単に出せて面白い!幻想的なマップと御伽噺のような獣たち 20250317 https://x.com/SakuraCrowd/status/1901213871937134633 カラクリ(最初はハコ)を一瞬で配置してそれに乗ってジャンプ強攻撃したり、高い壁のぼったりする要素が新しい。 すごく感動したのが、マップのおとぎ話のような幻想的なデザイン。 フィールドには入れる小屋があったり、それを壊されたり、ダイナミックなステージの変化も楽しい #WildHearts 武器強化や図鑑がこれから増えていくのを思うとワクワク!20250316 https://x.com/SakuraCrowd/status/1901215264269906190 武器を細かく強化していけそうなのがわくわくする 野営地に置く鍛冶の施設とかも少しずつ解除して、好きな位置に配置できる あと討伐した敵の情報も倒した数で詳細な情報が見られる #WildHearts 1バトル5分だけどハラハラ!初の武器強化! 20250317   https://x.com/SakuraCrowd/status/1901597289082405135 ハナヤドシを5回狩ると図鑑が詳しくなって、生態の説明の他に、レアなアイテムを落とす部位もわかった。 しっぽの先についている塊に栄養を吸い取られているためにいつも貪欲らしい。 その塊を何とか3回部位破壊して今作れる一番強いからくり刀できた 一戦5分くらいでできるのがいい #WildHearts コハクヌシを倒して氏繁救出!マグマみたいなのは琥珀だったのかー 20250317 鍛冶師のなつめが言っていた、氏繁をコハクヌシから助ける コハクヌシの住処の洞窟の上から声がして、探してたらやられてしまったw そのあとまたその場所に戻ってバトル再開して勝った 氏繁はなんか飄々としていて、まじめななつめとの3人の旅が面白くなりそう #WildHearts カラカラとなったらコダマを探すの...