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 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