Skip to content

Instantly share code, notes, and snippets.

@yum45f
Last active April 10, 2018 15:24
Show Gist options
  • Save yum45f/c796b6c0c8584488689c048452a83034 to your computer and use it in GitHub Desktop.
Save yum45f/c796b6c0c8584488689c048452a83034 to your computer and use it in GitHub Desktop.
Unity とかの複数ファイルの変数参照。(1,2年前にやってた程度なのであんま覚えてない)
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 してる。(代入ももちろん。)
}
}
}
@yum45f
Copy link
Author

yum45f commented Apr 9, 2018

GamePlayer_Property.cs がプロパティ系をまとめてるクラスで、Class1.cs や Class2.cs が共有してもらってるクラス。

@yum45f
Copy link
Author

yum45f commented Apr 9, 2018

なお Ruby ばっかり書いてるので () や {} や ; やらを付け忘れてるかも

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

Unity で用意されてる GetComponent() があるけどどっちがよいんだろう... 🤔 💭
個人的にはこっちの方をよく書いてた(どれが何のプロパティなのかがよく分かったから。)けど。
ちょっと GetComponent 癖があるんだよなー。
あ、でも static じゃない変数フィールド?は GetComponent の方がよいのか。

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

位置情報とかゲームオブジェクトと直接的に絡みついている情報とかは GetComponent の方がよいのかもしれない。
その他は、この方法がよいのかも。

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

これに加えてUnity 名前空間とかもちょっと制約があったような。
変数というよりはプロパティといった方がよいのか...
やはりケースバイケース的な感じなんだろうか...
http://unity-michi.com/post-638/
やっぱり見通しがよくなることには変わりはない...

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

うーん?
これは <クラス名>.<プロパティ名> or GetComponent().<プロパティ名> の考えだっけ。
まあとりあえずプロパティにした方がよいというの変わりはないのか。ちょっと混乱。
半分 Unity の仕様忘れてるな、こりゃ。
うーん... 問題は変数の共有方法だった気がするけど...

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

あ!わかった!
問題は、「クローンするか、否か」だ!
確かに、ゲームの初期化でクローンされないし、わざわざ EmptyObject に割り当てるよりは、Class参照の方が良いんだ、たぶん。
逆に、クローンされるような変数はぜーんぶGetComponent じゃなきゃダメなんだわ。
Scratch でいう 「すべての変数」と、「このスプライトだけ」という感じか。
そうだ、あとは Find とかもあった。(ようやく思い出し。)
SCOREとかの共有は GameManager クラスでも用意して、そこに Score プロパティ作って、 GameManager.Score で取得すればいいんだ。
逆に各キャラの HP とかはそれぞれの Component で取得せねばならんのか。
なるほどなるほど。
http://myoujing.wpblog.jp/2014/06/760/

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

これはもっかいUnity勉強しなおしやな...
一回頭に入ってる分ので記憶の呼び戻しは簡単なので、ざっと、Ninjaになぶり殺される前に...

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

やっぱりケースバイケースだな。
もっかい頑張って勉強しなおし...
https://qiita.com/hkomo746/items/1988a395020e16ef0365

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

ん?
でもこの方法だと別クラスにインスタンス立てて... みたいな感じになるかも。
あー、Start() で呼べばいいんか、初期化含めて... あれ?

@yum45f
Copy link
Author

yum45f commented Apr 10, 2018

ちょっと普通のC#の考え方と違うから難しい。
たぶんこれで合ってるだろうけど、もはや頭が混乱してきたので明日じっくり考えよう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment