-
-
Save yum45f/c796b6c0c8584488689c048452a83034 to your computer and use it in GitHub Desktop.
using UnityEngine; | |
using System.Collections; | |
public class GamePlayerProperty : MonoBehaviour { | |
//ここで変数系はまとめて定義&初期化の時に自動でセットされる値を設定。 | |
public float PlayerSpeed { get; set; } = 10; | |
public string PlayerName { get; set; } = "Hoge Hoge Man"; | |
public float Score { get; set; } = 0; | |
// なお、上の式は以下のと同意。(省略形で、バージョン古いと未対応... 確か C# 6.0 から大丈夫。) | |
// 省略形で書かなくてもよいけどもう見たらわかるし長々と書くよりは上の方が読みやすいような気が。 | |
// public float PlayerSpeed { get; set; } = 10; と下は同意。 | |
private float _playerspeed = 10; | |
public float PlayerSpeed { | |
get { return _playerspeed; } | |
set { __playerspeed = value; } | |
} | |
// public string PlayerName { get; set; }= "Hoge Hoge Man"; と下は同意。 | |
private string _playername = "Hoge Hoge Man"; | |
public string PlayerName | |
{ | |
get { return _playername; } | |
set { _playername = value; } | |
} | |
} |
using UnityEngine; | |
using System.Collections; | |
public class UnityClass1 : MonoBehaviour{ | |
void Start(){ | |
GamePlayer_Property.player_speed = 35; // <クラス名>.変数 でもアクセス可能。なお、代入演算子の左辺に持ってきているのでこれは set が呼ばれるかと。 | |
player_speed = GamePlayer_Property.player_speed // 右辺に持ってくると get が呼ばれる。 | |
GamePlayer_Property.player_name = "HogeHoge FooBarMan" // String型も同じく。 | |
} | |
void Update() { | |
gameobject = <FIND をするなりなんなりと(忘れた)> | |
float speed = gameobject.GetComponent<GamePlayerProperty>().PlayerSpeed // これでも取得できる、というか複製されるものは基本これだった。すみません。 | |
} | |
void DestroyEnemy() { | |
GamePlayer_Property.score += 10 // こんな感じで複製されないのは直接 <Class名>.<Property名> で OK だと思う。 | |
} | |
} |
using UnityEngine; | |
using System.Collections; | |
public class UnityClass2 : MonoBehaviour{ | |
void Start(){ | |
if (GamePlayer_Property.Score >= 30) { | |
// 比較演算子みたいなところに出すと get が自動的に呼ばれて値の出力ができる...(とおもう。できんくても明示的に .get 呼べばよいかと。) | |
// ちょっと考えてみたら、クローンとかされる場合は GetComponent を使った方が面倒でないという結論に至ったのですみません。(しばらく静的なアプリしか作ってなかったから。) | |
// プロパティにした方がよいのはそのままかと。(詳細はコメントを見てくだされば。) | |
GamePlayer_Property.player_speed = 30; // set してる。(代入ももちろん。) | |
} | |
} | |
} |
なお Ruby ばっかり書いてるので () や {} や ; やらを付け忘れてるかも
Unity で用意されてる GetComponent() があるけどどっちがよいんだろう... 🤔 💭
個人的にはこっちの方をよく書いてた(どれが何のプロパティなのかがよく分かったから。)けど。
ちょっと GetComponent 癖があるんだよなー。
あ、でも static じゃない変数フィールド?は GetComponent の方がよいのか。
位置情報とかゲームオブジェクトと直接的に絡みついている情報とかは GetComponent の方がよいのかもしれない。
その他は、この方法がよいのかも。
これに加えてUnity 名前空間とかもちょっと制約があったような。
変数というよりはプロパティといった方がよいのか...
やはりケースバイケース的な感じなんだろうか...
http://unity-michi.com/post-638/
やっぱり見通しがよくなることには変わりはない...
うーん?
これは <クラス名>.<プロパティ名> or GetComponent().<プロパティ名> の考えだっけ。
まあとりあえずプロパティにした方がよいというの変わりはないのか。ちょっと混乱。
半分 Unity の仕様忘れてるな、こりゃ。
うーん... 問題は変数の共有方法だった気がするけど...
あ!わかった!
問題は、「クローンするか、否か」だ!
確かに、ゲームの初期化でクローンされないし、わざわざ EmptyObject に割り当てるよりは、Class参照の方が良いんだ、たぶん。
逆に、クローンされるような変数はぜーんぶGetComponent じゃなきゃダメなんだわ。
Scratch でいう 「すべての変数」と、「このスプライトだけ」という感じか。
そうだ、あとは Find とかもあった。(ようやく思い出し。)
SCOREとかの共有は GameManager クラスでも用意して、そこに Score プロパティ作って、 GameManager.Score で取得すればいいんだ。
逆に各キャラの HP とかはそれぞれの Component で取得せねばならんのか。
なるほどなるほど。
http://myoujing.wpblog.jp/2014/06/760/
これはもっかいUnity勉強しなおしやな...
一回頭に入ってる分ので記憶の呼び戻しは簡単なので、ざっと、Ninjaになぶり殺される前に...
やっぱりケースバイケースだな。
もっかい頑張って勉強しなおし...
https://qiita.com/hkomo746/items/1988a395020e16ef0365
ん?
でもこの方法だと別クラスにインスタンス立てて... みたいな感じになるかも。
あー、Start() で呼べばいいんか、初期化含めて... あれ?
ちょっと普通のC#の考え方と違うから難しい。
たぶんこれで合ってるだろうけど、もはや頭が混乱してきたので明日じっくり考えよう。
GamePlayer_Property.cs がプロパティ系をまとめてるクラスで、Class1.cs や Class2.cs が共有してもらってるクラス。