Notifications
bg
ゆに丸1号
Community Mascot - Other
41
Likes
15
Followers
0
Connections
All
Articles2
Games0
Showcases0
Column2
Jobs0
【やり取り相手を指定する方法まとめ】#9
この定期投稿では、これからUnityを始める人の助けになるような情報を伝えていきます。
バックナンバーはこちら:http://bit.ly/omanabi-back

変数を static に設定すると、アクセスがとても簡単になるという認識で使っている方も結構いるかなーと思います。

static に設定すると、その変数は全てのオブジェクトで値が共有されアクセスが比較的容易になります。
その代わりシーンを移動しても(特定のオブジェクトを破棄しても)ゲームを終了しない限り値はリセットされなくなり、扱いにくくもなります。

ボクは最初に作ったブロック崩しのゲームではスコア管理に static を使っていました。結果、ゲームを繰り返し遊べるようにしたら前回のスコアが引き継がれて延々とスコアが伸びて意味が分からん…!となりました。
static を使えばシーン遷移しても値がリセットされないため移動先でもその値を使いたい場合には便利だと思います。
一方でもし使うなら例えばスコアならゲームを再度始める寸前など、リセットすべきタイミングで自分で明示的にリセットする必要がある、ということも覚えておく必要があります。

あと、HPなど各キャラごとに個別管理する必要があるものもアクセスが容易になるからと static に設定すると、1体倒したら何故か全員死んだ、みたいな現象も起こりうるので気をつけましょう!(実体験です)

具体的なコードや、そのほかの方法については下記の記事に載っているのでこちらも読んでみてください。
http://tsubakit1.hateblo.jp/entry/2015/11/07/024350

質問があればコメントまでどうぞー!

ゆに丸1号
4 days ago
taka1890いつもありがとうございます! ・staticを使用してスコアを共有する ・ゲームを繰り返し遊べるようにする 上記2点に今現在取り組んでいるので、非常に参考になりました! 今のまま進めていたら、延々とスコアが加算されていくゲームになるところでした、、、
役に立ったようでよかったです!!
t
taka1890
4 days ago
いつもありがとうございます! ・staticを使用してスコアを共有する ・ゲームを繰り返し遊べるようにする 上記2点に今現在取り組んでいるので、非常に参考になりました! 今のまま進めていたら、延々とスコアが加算されていくゲームになるところでした、、、
【やり取り相手を指定する方法まとめ】#8
この定期投稿では、これからUnityを始める人の助けになるような情報を伝えていきます。
バックナンバーはこちら:http://bit.ly/omanabi-back

今回は やり取り相手を指定する、というより情報(参照)を引っ張ってくるときの方法をチラ見してみようという内容です。
つまり、 Instantiate で弾丸を発射する時のコピー元や、ソシャゲで新規キャラクターを追加したい時はどのような方法があるのか、という話とも言えるかなと思います。

まず比較的 非推奨な方法として Resources があります。手軽に使えてぼくは好きなんですが、微妙なところもあります。
勿論絶対ダメという話ではないのですが、具体的にどう非推奨なのか、では使い所はあるのか、という話は下記の記事にまとまっていました。
http://kan-kikuchi.hatenablog.com/entry/Resources_BestPractices

次に上記記事の中でも紹介されているアセットバンドルを使用するという方法です。ソシャゲをやる人だと初回ダウンロード後のゲーム起動直後などにファイルのダウンロードが行われるのを見たことがあると思いますが、それが Unity 製のゲームであれば多くの場合アセットバンドルをダウンロードしているはずです。
そのようにゲームに新規キャラクター用のデータなどのファイルを追加するときに使われる機能となります。
より詳しく知りたい方はマニュアルを読んでみてくださいー。
https://docs.unity3d.com/ja/current/Manual/AssetBundlesIntro.html

最後にAddressable Assets についてです。
これは Resources とアセットバンドルの上位互換と言って良さそうな機能です。が、残念ながらボクはまだ使ったことがないので多くを書けません…!
どのようなところが良いかは以下の記事にまとまっているので存在を知らなかったという方は是非読んでみてください!
http://kan-kikuchi.hatenablog.com/entry/Addressable_Assets

以上ざっとした紹介でした。
Addressable Assets についてはいずれまた紹介できたらと思います。

何か質問があればコメントまでどうぞー!

fantom
6 days ago
@ゆに丸1号 なるほど「Autoya」ですか。ちょっと試してみます!
ゆに丸1号
7 days ago
fantom@ゆに丸1号 そう言えばAssetBundleの管理って皆さん何を使ってるんですかね~? AssetBundleの管理ツールで代表的なものをちょっと知りたいです(互換性も試してみたい)。 私は公式のAssetBundleManagerを少し改造したものを使ってるんですが、 http://fantom1x.blog130.fc2.com/blog-entry-237.html こういうやり方だと、他のサードパーティのツールとの互換性が無くなるので、保守性が良くないと感じてるんですよね(この記事自体は「WebGLでAssetBundleを使う」というテーマですが、普通にPCでもスマホでも使えます。まだWebGLが正式リリースされたばかりのときに実験したという記事)。 そういう意味では「Addressable Assets」が正式リリースされたら、管理を共通化できると思うので期待ですね。実際に試してみるとローカルを更新したら、バンドルも自動更新してくれるので、AssetBundleみたいにビルドし忘れしなくて済みそうです(笑)。 ただ「Addressable Assets」はまだ「preview 版」なので、色々不具合あるみたいです。特にバージョンによる互換性がないのか、バージョンアップで全滅したり(ローカルにはデータが残っているが、元のバージョンに戻しても参照は戻らない)、たぶん .NET 4.x には完全対応はしてないみたいですね(色々エラーが出る。どちらかというと 3.x の方がきちんと動く)。なので現在は試すだけで、いずれAssetBundleからの移行を考慮に入れて、構成を考えた方が良いかもですね(グループやラベルの概念を予め入れておくと移行が簡単になると思う)。でも「Addressable Assets」はコードも簡潔で、AssetBundleの「かゆいところに手が届く」的な機能はほとんど入ってる感じなので(講演ビデオも観ましたが、かなりよくユーザーの利用方法を考えて作られてるようです)、正式版が楽しみですね!
うーん、あまり自分でガッツリアセットバンドル周り触ることが無いのでほかの方の意見を見てみたいところですが、Twitterとかで流れてくる意見を見ると Autoya が良い、らしいです。 https://github.com/sassembla/Autoya Addressable Assets はご指摘の通り preview 段階なので、確かに楽しみですねー!
fantom
7 days ago
@ゆに丸1号 そう言えばAssetBundleの管理って皆さん何を使ってるんですかね~? AssetBundleの管理ツールで代表的なものをちょっと知りたいです(互換性も試してみたい)。 私は公式のAssetBundleManagerを少し改造したものを使ってるんですが、 http://fantom1x.blog130.fc2.com/blog-entry-237.html こういうやり方だと、他のサードパーティのツールとの互換性が無くなるので、保守性が良くないと感じてるんですよね(この記事自体は「WebGLでAssetBundleを使う」というテーマですが、普通にPCでもスマホでも使えます。まだWebGLが正式リリースされたばかりのときに実験したという記事)。 そういう意味では「Addressable Assets」が正式リリースされたら、管理を共通化できると思うので期待ですね。実際に試してみるとローカルを更新したら、バンドルも自動更新してくれるので、AssetBundleみたいにビルドし忘れしなくて済みそうです(笑)。 ただ「Addressable Assets」はまだ「preview 版」なので、色々不具合あるみたいです。特にバージョンによる互換性がないのか、バージョンアップで全滅したり(ローカルにはデータが残っているが、元のバージョンに戻しても参照は戻らない)、たぶん .NET 4.x には完全対応はしてないみたいですね(色々エラーが出る。どちらかというと 3.x の方がきちんと動く)。なので現在は試すだけで、いずれAssetBundleからの移行を考慮に入れて、構成を考えた方が良いかもですね(グループやラベルの概念を予め入れておくと移行が簡単になると思う)。でも「Addressable Assets」はコードも簡潔で、AssetBundleの「かゆいところに手が届く」的な機能はほとんど入ってる感じなので(講演ビデオも観ましたが、かなりよくユーザーの利用方法を考えて作られてるようです)、正式版が楽しみですね!
【やり取り相手を指定する方法まとめ】#7
この定期投稿では、これからUnityを始める人の助けになるような情報を伝えていきます。
バックナンバーはこちら:http://bit.ly/omanabi-back

今回は FindObjectOfType についてです。FindObjectOfType は全オブジェクトに対する GetComponent というイメージです。

GetComponent はあるゲームオブジェクトのコンポーネントが求めているものかどうかをヒエラルキーでアタッチされているコンポーネントを上から順に確認して行き、探しているものならそれを取得するような動作なのですが、 FindObjectOfType はそれをシーンにある全オブジェクトに対して行います。

探しているコンポーネントの1つ目だけを取得するのが FindObjectOfType で、シーンにあるものすべてを取得するのが FindObjectsOfType です。 FindGameObjectsWithTag 同様 s が増えているだけで結果が異なる類のもののため、特に写経をしている時には注意しましょう!

また、この関数は重いと言われることが多いです。実際比較的重い方ではあるので、 Start() などの呼ばれる頻度の少ないところで使うようにした方が良いかもしれません。
http://baba-s.hatenablog.com/entry/2014/07/09/093240

ちなみにこの記事を書いている時に関連するソースコードを読んでいて知ったので蛇足として書くのですが、最初の1つだけを取得する FindObjectOfType の場合も全コンポーネントを一度は取得しているようです。重いわけですね…
https://github.com/Unity-Technologies/UnityCsReference/blob/73f36bfe71b68d241a6802e0396dc6d6822cb520/Runtime/Export/UnityEngineObject.bindings.cs#L343

質問などあればコメントまで!

ゆに丸1号
7 days ago
拡張ライブラリが出てるかは分かりませんが、全オブジェクトの管理とかも合わせて自分で面倒を見るのは辛いので FindObjectOfType をあまり高頻度で使わない、というくらいにしておくので良いかなーとボクは思いますー。
fantom
7 days ago
@ゆに丸1号 値を見ると"~Tag"以外は線形探索みたいですね。 しかし「FindObjectOfType」は結果配列の[0]を返す仕様でしたか(笑)。これは自前で枝刈り探索法を考えた方が良いかな(笑)。もしかして別途拡張ライブラリとか出てますかね?
お学び記事バックナンバー
「Unityお学びグループ」で連載している解説記事のこれまでのまとめです。随時更新!
お学び記事バックナンバー
Article
Keyko Gomez
4 months ago
これ便利!ありがとうございます。
ゆに丸1号
4 months ago
まとめてみましたー。これからもよろしくです。
【やり取り相手を指定する方法まとめ】#6
この定期投稿では、これからUnityを始める人の助けになるような情報を伝えていきます。
バックナンバーはこちら:http://bit.ly/omanabi-back

今週もやり取り相手の指定する方法についてです。
今回は GetComponent について。

GetComponent は現在指定しているオブジェクトから特定のコンポーネントを探す関数です。
例えば Find(“ユニティちゃん”).GetComponent<Transform>() ならユニティちゃんという名前のオブジェクトの Transform コンポーネントを探し、
FindWithTag(“UnityChan”).GetComponent<MeshCollider>() なら UnityChan というタグがついたオブジェクトの MeshCollider コンポーネントを探し、
GetComponent<Rigidbody>() ならそのスクリプトがついているオブジェクト自身の Rigidbody を探す、という感じです。

そうして各コンポーネントの場所を探すのはコンポーネントの参照を得る、と言うこともあります。 Unity に限った話ではないと思いますが、こうして参照を得てはじめてその相手の大きさなどの値を得たり、位置を変更するなどの命令を出すことができます。

何気なく写経したチュートリアルの GetComponent も、そうしたイメージを持って見直すと色々納得できるかも…?

質問などあればコメントまでどうぞ!

【やり取り相手を指定する方法まとめ】#5
この定期投稿では、これからUnityを始める人の助けになるような情報を伝えていきます。
バックナンバーはこちら:http://bit.ly/omanabi-back

前回扱ったのはゲームオブジェクトの名前で検索して一致するものを1つだけ取得する Find でした。

今回はゲームオブジェクトに設定したタグを元に検索を行う方法で、1つだけ取得する場合は GameObject.FindWithTag を、複数取得する場合は GameObject.FindGameObjectsWithTag を使用します。

GameObject.FindGameObjectWithTag という With の前に s がなく FindWithTag と同じ動作のものもあるのですが、これが1文字違うだけなのでなんとなく書いていると間違えることも多く、結構罠だなと思っています。
例えば以下のようなコードの場合。

void Start () {
var playerCase0 = GameObject.FindWithTag("Player");
playerCase0.name = "Player"; // 名前の変更. エラーなし.

var playerCase1 = GameObject.FindGameObjectWithTag("Player");
playerCase1.name = "Player"; // 名前の変更. これは単一のものを取得するので、エラーなし.

var players = GameObject.FindGameObjectsWithTag("Player");
players.name = "Player"; // 配列が相手なのでエラー!!
}

ややこしいですが、 3つ目の players は配列なのでアクセスするときは何番目にアクセスするのか指定した上で操作しなくてはいけません。

画像も作ってみたのでそちらもみてみてください!

何か質問があればコメントまでどうぞー

About Me
No description
See more
Skills
No skills added yet
Certifications (0)
Import
See all
ゆに丸1号's liked projects (2)
Following (2)
Followers (15)
Following Companies (0)
Not following anyone yet