忍者ブログ
個人サークル「のくたん結鼓」の子が、色々書き残すだけの処。梅よろしでも飲みながらのんびり見てやってください
[54]  [52]  [51]  [50]  [49]  [48]  [47]  [46]  [45]  [44
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Unityで演出とかずっと動き続けているものとかそういうのを作る時には
Sceneビューで確認、編集ができるAnimationを使う人がほとんどかもしれません。

ただ人によってはAnimationが使いにくい!
演出はソースで組みたい!って人もいます。

私もそうです。




コルーチンは基本的に一方向的な処理を行わせるのが得意で
私はよく敵の行動パターンや制御をする必要のない演出に使ったりします。

ただ、大規模ゲームになってくると正直それよりも必要な部分に使う必要が出てきます。
特に非同期にシーンを読んだりAsync系のロードを行う時には
内部の方でコルーチンが回っていたりします。

このAsyncなどを使う場合で注意すべきなのは読んだら非同期で動くということなんです。

動くということはその分瞬間的なメモリが使用されるということです。
つまり同時にAsyncを20件でも読もうものならそれはもうひどいことに。

そんなことないだろと思う人もいるでしょうが、絶対にそれがないとは言い切れないんです。

ではどうするか?

そのための内容が今回になります。

そもそもAsync系の命令が同時に呼ばれるという恐れ。
それはUnityがCloneのObjectを作れるという結果です。
Async命令が入ったCompornentをもったObjectを同時に100体……

それが起きないとは言い切れない。
じゃあ、起きた場合にどうするのかということを考えると答えは簡単です。

コルーチンを行うための処理を同時に呼ばせなければいい。
でもコルーチンを使うという命令は同時に呼びたい。

ならObjectでStartCoroutineをしようせず管理するクラスに
コルーチンを使うことを命令すればいいんです。

public class LoadingCoroutineManager : MonoBehaviour
{
/*
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void RuntimeInitialization()
{
var obj = new GameObject("CoroutineManager");
obj.AddComponent();
}*/

public static LoadingCoroutineManager instance;
public static LoadingCoroutineManager Instance
{
get { return instance; }
}

static Queue queueCoroutine = new Queue();
static bool queueStack = false;

#region UNITY_MAIN

void Awake()
{
if (instance != null && instance.GetInstanceID() != this.GetInstanceID())
{
Destroy(this.gameObject);
return;
}

instance = this;
}

#endregion // UNIYT_MAIN:

public void AddCoroutine(IEnumerator coroutine)
{
queueCoroutine.Enqueue(coroutine);
if (!queueStack)
{
queueStack = true;
StartCoroutine("QueueStackLoad");
}
}

IEnumerator QueueStackLoad()
{
while (0 < queueCoroutine.Count)
{
yield return StartCoroutine(queueCoroutine.Dequeue());
}
queueStack = false;
}

}

ということでとても安価な方法で実装するとこんな感じです。
今回はIEnumeratorをシングルトンクラスのキューに保存し
そのキューがコルーチンを管理、呼び出しを行います。

これの最大の特徴はコルーチンなのに、呼び出しが終了したという判定が確認できるわけです。
これではまだちゃんとしたものはできそうにないですが、これを応用すると
「このクラスに同時に命令すれば終了の判定が取れ、なおかつその間はそれを示す演出が作れる」ということです。
クラス名からわかる通りローディングとかですかね。
IEnumeratorじゃなかったとしても非同期の命令を管理するための
シングルトンクラスというのは有用な部分もあります。

もちろんこういう命令はあまり使用されないことに越したことはないですが、
なんかコルーチンを使うと思いなと感じた時にはこの手を考えてみるのもありだと思います。
PR
back
COMMENT
name
title
text
color   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
mail
URL
pass
secret
PREV ←  HOME  → NEXT
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新コメント
プロフィール
HN:
あい。
年齢:
30
性別:
非公開
誕生日:
1994/01/09
自己紹介:
仕事でunityしつつ、3Dとかやるので
そろそろどこに向かってるのか分からなくなってきた人

めーるあどれす:
nokutan_aiあっとyahoo.co.jp

このブログはリンクフリーです。
バナーのURL
"https://blog.cnobi.jp/v1/blog/user/ffb3f4a3a70931da92ac361f9c87596b/1408110435"
になってると思います。




カウンター
リンク
リンク先募集してます!
Copyright (C) 2024 結鼓記録書庫 All Rights Reserved.

Photo by (c)Tomo.Yun   TemplateDesign by kaie
忍者ブログ [PR]