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やらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】LinqのMAX,MINを使うとListの中の最大数とか簡単に取れるんすね。 

    こんにちは。坂内っす。

    ポケガ3って今Unity2020.1で開発してるんですが、Android12だと動かないことがあるとのことが判明。

    Unity2020.3くらいにしないといけないぽいですね。
    ちょっと手元にAndroid12の実機がないためどんなエラーがでてるのか分からないですが・・・・


    ちょっとLinqの機能で最近使うものがあったので紹介。

    MAXとMIN おまけにSUMも。


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

    public class Blog20220228 : MonoBehaviour
    {
    public class Item0228 {
    public int itemNo;
    public string itemName;
    public int itemNum;
    }

    List items = new List();

    void Start()
    {
    SetItemData();

    // itemsの中で一番大きいItemNum
    Debug.Log(items.Max(x => x.itemNum));
    // itemsの中で一番小さいItemNum
    Debug.Log(items.Min(x => x.itemNum));
    // ItemNumの合計
    Debug.Log(items.Sum(x => x.itemNum));
    }

    void SetItemData() {
    Item0228 item1 = new Item0228();
    item1.itemNo = 1;
    item1.itemName = "アイテム1";
    item1.itemNum = 10;
    items.Add(item1);
    Item0228 item2 = new Item0228();
    item2.itemNo = 2;
    item2.itemName = "アイテム2";
    item2.itemNum = 14;
    items.Add(item2);
    Item0228 item3 = new Item0228();
    item3.itemNo = 3;
    item3.itemName = "アイテム3";
    item3.itemNum = 21;
    items.Add(item3);
    Item0228 item4 = new Item0228();
    item4.itemNo = 1;
    item4.itemName = "アイテム4";
    item4.itemNum = 4;
    items.Add(item4);
    }

    }



    こんな感じでクラスを作ってListにぶち込みます。

    実際にMAXとかMINしてるのはここ。

    // itemsの中で一番大きいItemNum
    Debug.Log(items.Max(x => x.itemNum));
    // itemsの中で一番小さいItemNum
    Debug.Log(items.Min(x => x.itemNum));
    // ItemNumの合計
    Debug.Log(items.Sum(x => x.itemNum));

    実行結果はこれ。


    21
    UnityEngine.Debug:Log (object)
    Blog20220228:Start () (at Assets/Scripts/Blog20220228.cs:21)

    4
    UnityEngine.Debug:Log (object)
    Blog20220228:Start () (at Assets/Scripts/Blog20220228.cs:23)

    49
    UnityEngine.Debug:Log (object)
    Blog20220228:Start () (at Assets/Scripts/Blog20220228.cs:25)



    ちゃんと各itemのitemNumから最大、最初、合計を持ってきてますね。

    という感じで、Listの中の値を簡単に取得計算できる方法でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】コンポーネントを一気に全部閉じたいとき 

    こんにちは。
    大坂です。

    あまり一つのオブジェクトにコンポーネントを大量につけることはないのですが、
    ある程度ついてるとコンポーネントを1個1個閉じながら目的のコンポーネントを探すときがあります。
    そんな時はInspectorタブあたりで右クリックをして「Collapse All Components」を使うと一気に全部閉じてくれます。



    こんな感じで動きます。


    一連の流れでやってますが、「Expand All Components」を使えば、一気に全部開いてくれます。
    大したことではないですが、地味に使えますね。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityの3Dオブジェクトに動画を再生する方法。 

    こんにちは。坂内っす。

    Unityゲーム内の3Dオブジェクトに動画を流す方法は?と思ったので調べてみました。

    意外と簡単にできますね。


    ①動画ファイルをプロジェクトに置く
    適当に動画を配置しました。


    ②3DのCubeを作成

    ③2で作成したCubeにAddComponentで「Video Player」を追加します。


    ④VideoPlayerのVideoClipに①の動画ファイルをアサインします。


    これだけで、Cubeに動画を再生するとができました。



    すごい簡単にできますね!
    (ポケガ2のPVです。3ではありませんあしからず)

    そのままではできないぽいですが、アセットとかつかうとYoutubeの動画を再生もできるぽいですね。

    ということで、Unityの3Dオブジェクトに動画を再生する方法でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】画像の間にパーティクルを出したいときは ParticleEffectForUGUI が便利 

    こんにちは。
    大坂です。

    背景とボタンなどのUIの間にパーティクルを出したいときがあります。
    色々方法はあると思いますが、ParticleEffectForUGUI を使うと便利ですね。

    ダウンロードしてプロジェクトに入れるとUIのメニューのParticleSystemが追加されます。


    作ってみるとこういう感じになります。


    UIParticleにはこんなスクリプトがついてますね。


    この状態だとパーティクルはボタンの上に出ます。


    UIParticleの位置をBgとButtonGroupの間にもっていきます。



    パーティクルが背景とボタンの間になりましたね!

    既存のパーティクルに使いたい場合はパーティクル自体にUIParticleコンポーネントを付けても動作します。
    こんな感じでパーティクルの表示順を簡単に変えられて便利ですね。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity C# foreachでもこうやればindexがとれるんだってさ。 

    こんにちは。坂内っす。

    今日もUnity触ってます。

    さて、C#にてforeachを使うと、indexってとりたくなりますよね。
    もちろんforを使えば簡単にとれるんですが・・・


    using System.Collections.Generic;
    using UnityEngine;

    public class Blog20220214 : MonoBehaviour
    {
    List nameData = new List();

    void Start()
    {
    nameData.Add("あいうえお");
    nameData.Add("かきくけこ");
    nameData.Add("さしすせそ");
    nameData.Add("たちつてと");

    for (int i = 0; i < nameData.Count; i++) {
    Debug.Log(i + "番目 : " + nameData[i]);
    }
    }
    }


    例えばこんな感じ。

    forを使えば〇番目のindexを簡単にとることができます。

    でもforeachってそのままだとindex取れないんですよね。

    でも、Linqを使うとforeachでもindexが取れるようです。


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

    public class Blog20220214 : MonoBehaviour
    {
    List nameData = new List();

    void Start()
    {
    nameData.Add("あいうえお");
    nameData.Add("かきくけこ");
    nameData.Add("さしすせそ");
    nameData.Add("たちつてと");

    foreach (var item in nameData.Select((value, index) => (value, index))) {
    Debug.Log(item.index + "番目 : " + item.value);
    }
    }
    }



    こんな感じに書くことで、先ほどのforの時と全く同じようにとることができます。

    今度使ってみよう!

    ということで、foreachでindexをとる方法でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityでカラープリセット使ってますか? 

    こんにちは。
    大坂です。

    Unityでカラープリセットを使っているでしょうか?
    よく使う色とかを設定しておくと使いたい色がすぐ指定出来て便利ですよね。
    赤枠の部分。


    設定の方法はこんな感じ。



    色を変えたら、一番下の四角を押すだけ。
    名前を付けておくとあとから使うときにわかりやすいですね。

    では今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】3Dサイコロを転がして、出目を確認してみる。これで無限サイコロができるぜ! 

    こんにちは。坂内っす。

    ポケガ3の開発進んでますよー ということで、SSを1枚ツイートさせて頂きました。



    ちょっと1,2よりステータスが細かいところがありますが、基本は1,2通りなのであんまり気にしないでもイイかもしれません。
    まだ調整してないですが・・・・

    さて、Unityでサイコロ生成してみました。
    ちゃんと出た目も判定するようにします。

    まずは、アセットストアから無料のサイコロをゲット。

    https://assetstore.unity.com/packages/3d/props/tools/dice-d6-game-ready-pbr-200151

    まずはPlaneだけを置いたシーンを用意。



    スペースキーを押した時にサイコロが出るようにします。

    [Blog20220207.cs]

    using UnityEngine;

    public class Blog20220207 : MonoBehaviour
    {
    [SerializeField] Dice dicePrefab;

    void Start()
    {
    }

    void Update()
    {
    if (Input.GetKeyDown(KeyCode.Space)) {
    if (diceCount < maxDice) {
    Instantiate(dicePrefab, new Vector3(0, 5, 0), Quaternion.identity);
    }
    }
    }
    }



    dicePrefabには先ほどのダイスのオブジェクトをアサインします。

    これでサイコロが出ますね。



    毎回2が上向きで落ちてきますね・・・・

    回転をランダムでつけてみましょう。

    サイコロに以下のコードを付けます。

    [Dice.cs]

    using UnityEngine;

    public class Dice : MonoBehaviour
    {
    void Start()
    {
    transform.rotation = Random.rotation;
    }
    }


    これでランダムな向きでおちてくるようになりました。



    っぽくなってきました。

    それでは、サイコロの動きが止まったときにどの目が出ているのかを取得するようにしましょう。

    いくつかやり方はあると思いますが、サイコロの各面の中心にオブジェクトをつけて、”どのオブジェクトが一番上にあるのか”で判定してみたいと思います。
    この方法をとった理由としては、サイコロ同士が重なったりして斜めになった時でも取得できるかと思ったからです。

    さて、やっていきましょう。



    こんな感じで、サイコロに空のGameObjectを6個つけました。
    dice1 - X:0 Y:0 Z:1
    dice2 - X:0 Y:1 Z:0
    dice3 - X:-1 Y:0 Z:0
    dice4 - X:1 Y:0 Z:0
    dice5 - X:0 Y:-1 Z:0
    dice6 - X:0 Y:0 Z:-1

    これらのオブジェクトのtransform.position.yが一番上にあるかで判定します。

    [Dice.cs]

    using UnityEngine;

    public class Dice : MonoBehaviour
    {
    [SerializeField] Rigidbody rb;
    [SerializeField] GameObject[] diceFaces;

    bool isCheck;

    void Start()
    {
    transform.rotation = Random.rotation;
    }

    void CheckDice() {
    if (rb.IsSleeping()) {
    int topIndex = 0;
    float topVal = diceFaces[0].transform.position.y;
    for(int i = 1; i < diceFaces.Length; i++) {
    if (diceFaces[i].transform.position.y > topVal) {
    topIndex = i;
    topVal = diceFaces[i].transform.position.y;
    }
    }
    Debug.Log(topIndex + 1);
    isCheck = true;
    }
    }

    void Update()
    {
    if (!isCheck) {
    CheckDice();
    }
    }
    }



    rigidbody.IsSleeping()で「止まった時」を判断できます。



    こんな感じで、サイコロの動きが止まった時に出目をログに出してみました。

    という感じで、簡単にサイコロを作ってみました。

    ちょっとCheckDiceのところをUpdateでやっているので、そこもっとイイ感じにできそうな気もします。

    ということで、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity2021.2でDictionaryにメソッドが増えたんですね 

    こんにちは。
    大坂です。

    Unity2021.2でDictionaryにメソッドが増えたんですね。(2021.1.5ではつかえなかったので、2021.2からっぽいです。)
    ・GetValueOrDefault
    ・Remove
    ・TryAdd
    が増えてました。
    Removeはもともとありましたが、削除したキーの値が受け取れるのが増えたんですかね。


    void Start() {
    Dictionary testDec = new Dictionary();
    // キー[1]に値が入っていないので、 test が返ってくる
    Debug.Log("GetValueOrDefault:" + testDec.GetValueOrDefault(1, "test"));

    // キー[1]に値が入っていないので、Trueが返ってくる
    Debug.Log("TryAdd_1:" + testDec.TryAdd(1, "test"));

    // キー[1]にTestが入っているので、Falseが返ってくる
    Debug.Log("TryAdd_2:" + testDec.TryAdd(1, "test_2"));

    // キー[1]Testが入っているので、Trueが帰ってきて、resultに「Test」が入る
    Debug.Log("Remove:" + testDec.Remove(1, out var result));
    Debug.Log("result:" + result);
    }

    一応結果。


    これでまた少し使いやすくなりましたね。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0