FC2ブログ
    05 «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.» 07

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

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

     

    【ハルシオンブログ】out修飾子のあるメソッドを作る 

    こんにちは。
    大坂です。
    今日から6月ですね。今年ももう半年終わりそうです…。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    DictionaryのTryGetValueみたいなことを自分でしたいときのお話。

    DictionaryのTryGetValue。

    Dictionary testDic = new Dictionary() { { 1, "test_1" }, { 2, "test_2" }};
    if(testDic.TryGetValue(1, out var test))
    {
    Debug.Log(test);
    }


    keyに含まれていたらboolを返却してくれて、outで対応したvalueを受け取れるメソッド。

    こんなことを自分で作ったメソッドでもやりたいときは、メソッドにout修飾子を追加してあげればできます。

    out修飾子のメソッドを作ってみる。

    private bool TryCheckTest(int index, out string test)
    {
    test = null;
    if(index >= 1 && index < 10)
    {
    test = "テスト";
    return true;
    }
    else
    {
    return false;
    }
    }

    メソッドの中でout修飾子の変数に値を入れてあげれば呼び出し側で受け取れます。

    呼び出し側

    if(TryCheckTest(1, out string test_1))
    {
    Debug.Log("引数:1:" + test_1);
    }

    if (TryCheckTest(10, out string test_2))
    {
    Debug.Log("引数:10:" + test_2);
    }



    引数が「1」の時だけちゃんとifの中に入ってログが流れますね。

    簡単な構成ならDictionaryとか使ってできますが、複雑な条件でで判定したい場合はこの方法で使うと比較的わかりやすくかけるので便利ですね!

    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity Updateの中でGetComponentをしてはいけませんよ?っていう基本の話 

    5月も終わりですね。
    5月もあっという間に終わった感じがします。
    さて横浜ゲームダンジョンに出ようかどうしようか・・・・・・坂内っす。


    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:



    Unityでの基本的な話なんだけど、Update内でGameObject.Findをしないという話。
    よく聞きますよね。
    実際にどれくらい重くなるのか試してみました。

    [Blog20230529.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20230529 : MonoBehaviour
    {
    [SerializeField] GameObject obj;
    [SerializeField] Image imgPlate;

    int rdmCnt = 0;
    System.Diagnostics.Stopwatch stopwatch;
    bool isMeasuring;

    private void Start() {
    // 準備
    for (int i = 0; i < 1000; i++) {
    Instantiate(obj, new Vector3(Random.Range(-3f, 3f), Random.Range(-4f, 6f), 0), Quaternion.identity);
    }
    stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    isMeasuring = true;
    }

    private void Update() {
    if (isMeasuring) {
    rdmCnt++;
    GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
    //imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
    if (rdmCnt >= 2000) {
    isMeasuring = false;
    stopwatch.Stop();
    Debug.Log((float)stopwatch.Elapsed.TotalSeconds);
    }
    }
    }
    }






    Startでは画面の負荷をあげるために、Sphereを1000個画面に適当に置いてます。

    2000回Imageの色を変えて時間を測ります。

    Updateの中の
    GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);

    imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);

    を切り替えて実行してみました。

    【GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
    11.10498秒

    【imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
    11.27025秒


    か・・・変わらねえ・・・・というか、GetComponentしてない方が遅い!?

    あれ??

    まぁただ、Updateで毎フレームFindで取得しにいくのはちょっと気持ち悪いのは気持ち悪いですよね…

    ちなみに処理負荷上げるために玉を10000個置いても、処理時間に差がありませんでした‥

    うちのPCだとちょっと時間の差はありませんでしたが、やめた方がいいですね!キリッ

    ということで、UpdateでGetComponentをしない方がいいよという話。全然検証になってませんが。

    では、あでゅ~!ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ifでキャスト判定した時にそのままキャストした変数として使う 

    こんにちは。
    大坂です。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    ifでis演算子を使用してキャスト判定した時って、そのままキャストした変数として使えるんですね。
    こんな感じでやってた。

    object obj = "test";
    if(obj is string) {
    Debug.Log(((string)obj).Length);
    }


    こうできます。

    object obj = "test";
    if(obj is string s) {
    Debug.Log(s.Length);
    }


    ちょっとだけ手間が省けますね。
    C#7からの機能らしいです。

    では今週も短いですがこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】配列ってあとからでもサイズ変えれるんですね。Resizeで配列のサイズを変えよう! 

    こんにちは。坂内っす。
    5月ももう終わりそうですね。
    時が過ぎるのがとても速いです・・・


    ポケットガール~受け継がれし希望~ でてます!

    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:



    Unityで配列使うことって多々ありますよね。

    でも配列って大きさ決めたら増やすこととかできないから使いずらいってことあると思います。
    その分Listのほうが自由にできていいですもんね。

    でも実は配列って宣言した後でもサイズ変えれるんですよ。


    Array.Resize(ref 配列, 変更後の要素数)

    [Blog20220522.cs]

    using System;
    using UnityEngine;

    public class Blog20230522 : MonoBehaviour
    {
    void Start() {
    int[] intAry = {0, 1, 2, 4, 6, 10 };
    Debug.Log("初期設定" + intAry.Length);

    Array.Resize(ref intAry, 10);

    Debug.Log("リサイズ後" + intAry.Length);
    }
    }





    こんな感じで、初め6個のintを入れたintAryですが、Resize後にはちゃんと10個の配列になっています。

    ということで、配列のサイズを初期設定後に変える方法でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】C#9で型名がわかっているときはnew 演算子で型名を省略できる 

    こんにちは。
    大坂です。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    C#9で型名がわかっているときはnew 演算子で型名を省略できるんですね。
    ターゲット型の new 式というらしいです。


    // 今までの書き方
    List test_1 = new List();

    // new で型を省略できる
    List test_2 = new();

    // エラー
    var test_3 = new();

    // メソッドの戻り値も省略できる
    List TestMethod()
    {
    return new() {1, 2, 3};
    }

    「var」のところはエラーになるので、型名を明示しているときだけできますね。

    大した話ではないですが、C#9でこんな機能があるよという紹介でした。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0