FC2ブログ
    01 «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.» 03

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】配列に特定の値を入れて初期化するとき 

    こんにちは。
    大坂です。

    2月も今日で終わりですね・・・

    さて今週の小ネタ。
    intの配列とかを初期値「-1」で初期化したいときのお話。

    こうやってました。
        int[] test = new int[10];
    for(int i = 0; i < test.Length; i++) {
    test[i] = -1;
    }

    これをLinqを使うと簡単にかけるようです。
        int[] test = Enumerable.Repeat(-1, 10).ToArray();

    これで初期値「-1」で長さ「10」の配列を作ってくれます。短くなりますね!
    「using System.Linq;」の追加をお忘れなく。

    では今週もこれで終わりですノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityのコルーチンで値を返す方法。いくつか方法あるぽいけど、その一つを紹介。 

    こんにちは。坂内っす。

    本日のお題は「コルーチンで結果を返したい」について。

    コルーチンってIEnumratorが戻り値だから、何も返せないっすよね。

    そんな時、以下のようにやると値を返せます。



    こんな感じの画面。
    ボタンを押すと、2秒後にテキストに「10」という文字を出す。

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;

    public class Script_20190225 : MonoBehaviour
    {
    [SerializeField]
    private Text txtView;

    void Start()
    {
    txtView.text = "";
    }

    public void OnClickButton() {
    StartCoroutine(Coroutine());
    }

    private IEnumerator Coroutine() {
    IEnumerator corutine = CoroutineCount();
    yield return StartCoroutine(corutine);
    txtView.text = "「" + (int)corutine.Current + "」";
    }

    private IEnumerator CoroutineCount() {
    int retNum = 10;
    yield return new WaitForSeconds(2f);
    yield return retNum;
    }
    }


    ボタンを押した2秒後に以下の画面になります。


    実際に10という数値を持っているのが「CoroutineCount」のメソッド内。
    CoroutineメソッドでCoroutineCountから10を返してもらうのに、coroutine.Currentを使ってます。

    OnClickButtonの中から
            IEnumerator corutine = CoroutineCount();
    StartCoroutine(corutine);
    txtView.text = "「" + (int)corutine.Current + "」";


    これをやろうとすると、StartCoroutineで2秒待たないため、coroutine.Currentが取れなくてエラーになります。
    yield return StartCoroutineでちゃんと待たないといけないため、コルーチンの中でやるのがええかと思います。

    では、実際に以下のコードの場合は何が返ってくるのか。

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;

    public class Script_20190225 : MonoBehaviour
    {
    [SerializeField]
    private Text txtView;

    void Start()
    {
    txtView.text = "";
    }

    public void OnClickButton() {
    IEnumerator corutine = CoroutineCountSec();
    StartCoroutine(corutine);
    txtView.text = corutine.Current.ToString();
    }

    private IEnumerator CoroutineCountSec() {
    yield return new WaitForSeconds(2f);
    }
    }


    ボタンを押した瞬間にテキストに出力。



    UnityEngine.WaitforSecondsが返ってきました。

    coroutine.Currentは「yield return で戻ってきてる何か」を持ってる感じなんですね。

    って感じで、返そうと思えばコルーチン内のモノはなんでも返せそうですね!
    今後使っていきます!


    ということで、今日はここまで!あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】BuildSettingsに設定したシーンの数とか一覧がほしいとき 

    こんにちは。
    大坂です。

    BuildSettingsに設定したシーンの情報がスクリプトでほしいことがあったときのお話です。
    ここのやつね。


    設定している数は「SceneManager.sceneCountInBuildSettings」で取得でき、
    設定している一覧がほしいときは「SceneUtility.GetScenePathByBuildIndex」を利用して取得します。
    「SceneUtility.GetScenePathByBuildIndex」は名前の通りパス付で取れます。

        Debug.Log("BuildSettingsのシーン数:" + SceneManager.sceneCountInBuildSettings);
    for(int i = 0; i < SceneManager.sceneCountInBuildSettings; i++) {
    Debug.Log(SceneUtility.GetScenePathByBuildIndex(i));
    }

    結果はこれ


    ここの情報が欲しいことがあることは少ないかもしれませんが、一応取れますよってことで。
    ではまたノシ

    Category: Androidアプリ紹介

    tb 0 : cm 0   

    【ハルシオンブログ】複数シーンのまとめて生成とまとめて破棄について。こういう使い方することあるのかな・・・ 

    こんにちは。坂内っす。

    シーンって複数つかってます?

    例えばこの3つのシーンがあるとします。
    シーン名はそれぞれ左から「20190218_1」「20190218_2」「20190218_3」となっています



    こいつをまとめて使う場合、起動シーンを用意して3つのシーンを読み込むことができます。

    using System.Collections;
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Script20190218 : MonoBehaviour
    {
    string[] SCENE_LIST = { "20190218_1", "20190218_2", "20190218_3" };

    private void Awake() {
    StartCoroutine(LoadScenes());
    }

    private IEnumerator LoadScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    yield return SceneManager.LoadSceneAsync(SCENE_LIST[i], LoadSceneMode.Additive);
    }
    }
    }


    実行するとこうなります。



    それぞれのシーンが読み込まれました。

    では全部のシーンを消す場合はどうでしょうか。

    これまた簡単で、こんなコードでできます。

        private IEnumerator ExitScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    if(SceneManager.GetSceneByName(SCENE_LIST[i]).IsValid()) {
    yield return SceneManager.UnloadSceneAsync(SCENE_LIST[i]);
    }
    }
    }


    実際に以下のコードを流してみましょう。

    using System.Collections;
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Script20190218 : MonoBehaviour
    {
    string[] SCENE_LIST = { "20190218_1", "20190218_2", "20190218_3" };

    private void Awake() {
    StartCoroutine(LoadScenes());
    }

    private IEnumerator LoadScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    yield return SceneManager.LoadSceneAsync(SCENE_LIST[i], LoadSceneMode.Additive);
    }

    yield return new WaitForSeconds(3);
    yield return StartCoroutine(ExitScenes());
    }

    private IEnumerator ExitScenes() {
    for(int i = 0; i < SCENE_LIST.Length; i++) {
    if(SceneManager.GetSceneByName(SCENE_LIST[i]).IsValid()) {
    yield return SceneManager.UnloadSceneAsync(SCENE_LIST[i]);
    }
    }
    }
    }


    全部のシーンを読み込んで、3秒後にすべてのシーンを破棄します。



    こんな感じで、複数シーンを生成破棄することができます。

    何かに役に立てば幸い情報でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 2   

    【ハルシオンブログ】HierarchyでスクリプトがどのGameObjectに付いてるか知りたかった 

    こんにちは。
    大坂です。

    シーンをいっぱいくっつけて作業をしていてあのスクリプトってどのGameObjectについてかなーなんて思って、
    いろいろ開いて探したりしてたのですが、簡単に見つける方法があるんですね。



    この赤い部分に「t:スクリプト名」とするだけ。
    こんな感じでやるとUnityTestってスクリプトがついているGameObjectだけになりますね!



    大文字小文字は気にしないみたいです。
    ぱっと探したいときに便利ですね。

    今週も短いですがこれで終わりですノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity2018.3のShurikenになんか新しい項目が追加されてたから触ってみた。Orbitalでパーティクルを回転してみよう! 

    こんにちは。坂内っす。

    なんかShurikenに新しい項目が追加されてるみたいですね。

    Velocityの項目なんですが。


    「Orbital」とかの項目って今までありませんでしたよね。

    途中からOrbitalのYやZを変えてみたらこんな動きをしたよ。



    パーティクルが回る感じなんすね!



    Orbital.X Y Z で回転軸を決めて、Speed Modifierで回転速度を決める感じなんですかね。
    Radialに値を入れると、どんどん回転が大きくなっていく感じぽいです。

    これで色々なエフェクトが作れるように!
    (俺にはむりや)

    ってことで、ちょっとしたUnity2018.3ネタでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】いつ見ても見慣れないNull演算子 

    こんにちは。
    大坂です。

    ネタになるようなことがなかったので小ネタ。
    まぁそんな感じばかりなのですが・・・。

    Null演算子で書いてあるといつ見ても違和感があります。
    こんな感じの書き方です。
        List<int> testList;

    void Start() {
    Debug.Log(testList?.Count);
    }

    「testList?」ってなんじゃい!って思うのですが、testListがnullの場合countを見てくれるって感じです。
    この場合はリストがnullなので「null」が帰ってきますね。
    リストになにか値が入っている場合はちゃんと入ってる要素数を返してくれます。

    あまりに短すぎるので似たようなやつをもう一つ。
    Null合体演算子ってやつ。
        string str;

    void Start() {
    Debug.Log(str ?? "Nullならこっちの文字列");
    }

    とすると、strがnull場合は「"Nullならこっちの文字列"」が返って、
    strに文字列が入っていればstrに入れた文字列を返してくれます。

    三項演算子でもかけますが、ちょっと省略できる感じですね。
        Debug.Log(str != null ? str : "Nullならこっちの文字列");

    パッと見てなんだっけな?と思う時があるのでメモがてらブログに。

    では今週もこの辺でノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】uGUIのTextをTextMeshProに変えたときにはまったやつ。なにこれ。 

    こんにちは。坂内っす。

    最近TMP(TextMeshPro)を使っていて、え?何?何が起きたの?・・・となったことを紹介。

    こんな感じでuGUIのTextとTMPのオブジェクトを並べてみます。



    前提条件として、CanvasのRenderModeは「Screen Space - Camera」です。



    この状態で・・・・・windowオブジェクトのScale.zを0にすると・・・・




    ぐしゃ・・・・

    見ての通り、Sceneウインドウでは何も変わらないのに対し、GameウインドウではTMPの文字が■■■■になってます。

    今までuGUIのTextでやっていたのを、TMPに変えてこの問題で暫く、はまってました。

    これ注意やで。

    ってことで、TMPの謎でした。あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0