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

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

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

     

    【ハルシオンブログ】stringの1文字1文字がほしいとき。 

    こんにちは。
    大坂です。

    今週も小ネタですよ。
    stringの1文字1文字がほしいとき・・・がたまにあるかもしれません。
    stringってIEnumerable<char>らしいので、こんな事ができますね。

    string test = "qwerty";
    foreach (char c in test)
    {
    Debug.Log(c);
    }

    結果。


    という感じで今週もこれで終わりですよ。
    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Blenderで作ったアニメーションをUnityに入れるとReadOnlyになっちゃうけど、それの回避法 

    こんにちは!坂内っす。

    ちょっとしたことなんだけど、Blenderで作ったモデルのアニメーションをUnityに取り込むと、ReadOnlyになってしまいます。

    そんな時には、ReadOnlyを外したいアニメーションをCtrl+Dでコピーすることで、コピー先のアニメーションからReadOnlyが外れています。
    アニメーションをコピー先のものに変更することで、変更ができるアニメーションになります。


    ほんとちょっとしたことですが、今日はこれにて!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】LinqのAggregateってちょっと面白いですかね? 

    こんにちは。
    大坂です。

    さて今週もLinqのちょっとしたネタです。
    いつものことですけど、ネタのなさがわかりますね!

    今週はAggregateのお話。
    何となく気になったので使ってみました。

    こんな感じのことができますね。

    List testList_1 = new List {3,5,1,7};
    // 合計
    Debug.Log("合計:" + testList_1.Aggregate((sum, num) => sum + num));
    // 最大値
    Debug.Log("最大値:" + testList_1.Aggregate((max, num) => (max < num) ? num : max));
    // カウント
    Debug.Log("カウント:" + testList_1.Aggregate(0, (count, num) => count + 1));

    List testList_2 = new List { "りんご", "パイナップル", "マンゴー", "ドラゴンフルーツ" };
    Debug.Log("一番長い名前:" + testList_2.Aggregate((longest, next) => next.Length > longest.Length ? next : longest));


    結果です。


    いろんな事ができるので知っておくと便利なこともあるかもしれません。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityで同じ項目を持つ複数のオブジェクトをまとめて取得設定する方法。 

    おはようございます。坂内です。
    今日も雨がずっと降っております。
    昨日一昨日あたりからずっと降ってますよね・・・・

    これ、以前にもやったかもしれませんが・・・・
    例えば、こんな感じで複数同じような情報がある場合、どうやってますか?





    こうやれば、できますが・・・・

    [Script0420.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Script0420 : MonoBehaviour
    {
    public Text[] lblNames;
    public Image[] imgCharas;
    public Text[] lblStrNums;
    public Text[] lblIntNums;
    public Text[] lblAgiNums;

    void Start()
    {
    for(int i = 0; i < lblNames.Length; i++) {
    lblNames[i].text = i + "番目のキャラ";
    //imgCharas[i].sprite = 絵を表示
    lblStrNums[i].text = Random.Range(1, 1000).ToString("n0");
    lblIntNums[i].text = Random.Range(1, 1000).ToString("n0");
    lblAgiNums[i].text = Random.Range(1, 1000).ToString("n0");
    }
    }
    }





    こんな感じでできます。

    ただ、この方法だと表示等の項目が増える度に配列を増やして・・・・・これが数十キャラの場合は?
    どんどん大変になっていきいますよね。

    今でもすでにこんな感じです。



    こんな時は大本のリスト1個で他の項目を自動で取得しちゃいましょう!

    まずはコードをこんな感じに変えます。

    [Script0420.cs]

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

    public class Script0420 : MonoBehaviour
    {
    public List<GameObject> charaObj;
    List<Text> lblNames = new List<Text>();
    List<Image> imgCharas = new List<Image>();
    List<Text> lblStrNums = new List<Text>();
    List<Text> lblIntNums = new List<Text>();
    List<Text> lblAgiNums = new List<Text>();

    void Start()
    {
    // キャラの表示オブジェクトを取得
    SetCharaBase();

    // キャラのデータを設定
    SetCharaData();
    }

    private void SetCharaBase() {
    foreach(GameObject charaBaseObj in charaObj) {
    lblNames.Add(charaBaseObj.transform.Find("lblName").GetComponent<Text>());
    imgCharas.Add(charaBaseObj.transform.Find("imgChara").GetComponent<Image>());
    lblStrNums.Add(charaBaseObj.transform.Find("lblStr").GetComponent<Text>());
    lblIntNums.Add(charaBaseObj.transform.Find("lblInt").GetComponent<Text>());
    lblAgiNums.Add(charaBaseObj.transform.Find("lblAGI").GetComponent<Text>());
    }
    }

    private void SetCharaData() {
    for(int i = 0; i < charaObj.Count; i++) {
    lblNames[i].text = i + "番目のキャラ";
    //imgCharas[i].sprite = 絵を表示
    lblStrNums[i].text = Random.Range(1, 1000).ToString("n0");
    lblIntNums[i].text = Random.Range(1, 1000).ToString("n0");
    lblAgiNums[i].text = Random.Range(1, 1000).ToString("n0");
    }
    }
    }



    ラベルやイメージ等の各キャラに付随するオブジェクトはベースのオブジェクトを起点に取得すればアサインをしなくてもいいですね。
    この方法だとアサインはベースとなるcharaObjをやるだけ。
    実際にはこんな感じ。



    アサインがすんごい楽ですよね。

    こんな感じにしていけば、大体こんな感じでいつもやってます。
    ベースとなるオブジェクト自体も名前を決めて、アサインをせずに自動で取得するようにすればもっと楽なのかもしれませんが・・・

    ってことで、同じようなオブジェクトをまとめて楽にとる方法でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】foreachで変数を使わずに繰り返し回数を得る方法 

    こんにちは。
    大坂です。

    今週もLinqのネタですね。
    foreachでもループ回数がほしいときがありますね。
    まぁforで書き直すかcounterなどの変数作って対応することが多いのですがLinqを使ってもできますよってお話です。

    コートです。

    List testList = new List {"a", "b", "c", "d", "e", };
    foreach(var test in testList.Select((Value, Index) => new { Value, Index }))
    {
    Debug.Log($"{test.Index}:{test.Value}");
    }


    結果です。


    どういう書き方が好みかにもよりますがこんな方法でも取得できますよという話でした。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity+ARっぽいなにかを・・・・カメラをRawImageに写してみた 

    おはようございます。坂内です。

    なんかすごい雨っすね。
    これ続くんでしょうか?
    まぁ家から出るわけじゃないから構わんのですが・・・


    さて今までやったことないことを軽く触ってみた。
    Unity+ARについて。

    まずはカメラを写す場所を設定するため、RawImageを作成し、とりあえずフル画面で設定しておきます。



    また、Canvasには以下のコンポーネントを付けています。



    [Blog20200413.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20200413 : MonoBehaviour
    {
    public RawImage camBgObj;
    void Start()
    {
    Screen.orientation = ScreenOrientation.Landscape;

    Vector2 screenSize = new Vector2(Screen.width, Screen.height);
    WebCamDevice[] devices = WebCamTexture.devices;
    WebCamTexture camTex = new WebCamTexture(devices[0].name, (int)screenSize.x, (int)screenSize.y, 60);

    camBgObj.material.mainTexture = camTex;
    camTex.Play();
    }
    }



    さて、一度これで実行してみましょう。



    これ実際にこのプロジェクトを実行した画面です。

    こんな感じで、カメラの映像をRawImageに写すことができました!

    ここまできたら、あとは好きにできそうですよね。

    適当にUI置いて・・・・・キャラ置いたり・・・・



    こんな感じなんですか?ARわかりません。

    カメラの背景をベースになんか色々やる感じなんですよね・・・たぶん・・・・

    って感じでARぽいのができました。

    よくあるARってマークや何かを起点に3Dオブジェクトを出したりするのが一般的ですよね。
    そっちはVuforiaというサービスを使えば色々できるらしいです!

    また、機会があればそっちも記事書くかもしれないし書かないかもしれません!


    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】配列やリストの要素の順番を逆にしたいとき・・・ 

    こんにちは。
    大坂です。

    コロナ関連で緊急事態宣言が出てますます出かけにくくなった今日このごろ。
    皆様いかがお過ごしでしょうか・・・。
    ボクは飲みに行けなくてツライですorz

    さてはて、配列やリストの要素の順番を逆にしたいとき・・・はありますかね・・・?
    あんまりないですかね?

    まぁそんなことをやりたいときはLinqのReverseを使いましょう!

    こんな感じですね。

    int[] test_1 = { 1, 2, 3, 4, 5 };
    Debug.Log("変更前:" + string.Join(",", test_1));
    int[] test_2 = test_1.Reverse().ToArray();
    Debug.Log("変更後:" + string.Join(",", test_2));




    はい!順番が逆になりましたね!
    なにかのときに簡単に順番を逆にできるので使えるかもしれませんね!

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】C#でforeachじゃなくてForEachってあるんですね。意外と便利なので紹介してみた。 

    おはようございます。坂内です。

    ついに非常事態宣言が発令されそうですね。
    明日からとかなんとか。
    「外出自粛を要請する期間は「最短でも3週間」だと言うことです。」ということで、最低でも1か月くらいは外出は自粛してくださいって流れになりそうですね。
    ただ、それだけで済むのかというとまだまだ、自粛は続きそうですよね。
    新型に対応できる薬が安定供給されるまでは、普通の生活は難しそうですね。


    さてUnityのネタに入ります。

    C#のForEachって使ってますか?
    foreachとは違います。

    https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1.foreach?redirectedfrom=MSDN&view=netframework-4.8#System_Collections_Generic_List_1_ForEach_System_Action__0__

    なんか1行で”指定の配列に対してまとめて処理を行う”ことができるようです。

    [Blog20200406.cs]

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

    public class Blog20200406 : MonoBehaviour
    {
    void Start()
    {
    List<int> array = new List<int>();
    array.Add(1);
    array.Add(2);
    array.Add(4);
    array.Add(10);
    array.Add(100);
    array.Add(200);
    array.Add(0);

    Action<int> action = new Action<int>(ViewNum);

    array.ForEach(action);
    }

    private void ViewNum(int i) {
    Debug.Log(i);
    }
    }



    [結果]


    ForEachの行は1行だけですよね。
    これで、ViewNumメソッドをarrayの全部に対して行うことができます。
    引数はデリゲートなんですけどね。


    foreach(int num in array){
    ViewNum(num);
    }

    とやるのと動きは一緒ですね。

    使いやすいほうでいいとは思いますが、こんな書き方もありますよーという紹介でした。

    では!あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】VisualStudio上で長いコードのエラー箇所に飛びたいとき 

    こんにちは。
    大坂です。

    行数が多いコードでコンパイルエラーが出ているときにVisualStudio上でエラー箇所に飛びたい場合ありますよね。
    そんなときは「Ctrl + Shift + F12」を押しましょう!
    エラー箇所に飛んでくれます。

    短いコードですがこんな感じになりますね。


    すごい長いコードでVisualStudio上で一瞬でエラー箇所に行きたいときは便利ですね!

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

    Category: 開発日記(Unity)

    tb 0 : cm 0