FC2ブログ
    02 «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.31.» 04

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

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

     

    【ハルシオンブログ】Unity2021.3でアプリがバックグラウンドに行った時の確認 

    こんにちは。
    大坂です。

    今日も ポケットガール~受け継がれし希望~ の宣伝から!
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    さて、OnApplicationPauseなんかを使ってアプリがバックグラウンドに行ったときやバックグラウンドから復帰したときに何か処理をさせたいときにUnityで確認する方法です。

    [ProjectSetting]-[Player]-[Windows,Mac,Linux settings]-[Run in Background]のチェックを外すだけなんですけどね。


    一応動作確認用コード。

    void OnApplicationPause(bool pauseStatus) {
    if (pauseStatus) {
    Debug.Log("pause");
    }
    else {
    Debug.Log("resume");
    }
    }


    Unityを非アクティブにしたりアクティブにしたりしてとちゃんとログが出ることが確認できれば大丈夫です。


    では今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】みなさんUnityで構造体って使ってますか?私全然使ってません。構造体のベースを紹介します。 

    寒かったり暖かかったり温度差が激しい今日この頃。
    皆様いかがお過ごしでしょうか?坂内っす。

    はい、ポケガ3でございます。
    まだ遊んでないそこのあなた、遊んでくださいね。

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

    PV:



    みなさんUnityで構造体って使ってますか?

    いくつかの変装をまとめて管理する際につかうやつです。

    [Blog0327.cs]

    using UnityEngine;

    public class Blog0327 : MonoBehaviour
    {
    private void Start() {
    EnemyInfo enemy = new EnemyInfo(1, "モンスター", 100, 10, 8);
    Debug.Log(enemy.name + " " + enemy.hp);
    }

    struct EnemyInfo {
    public int id;
    public string name;
    public int hp;
    public int atk;
    public int def;
    public EnemyInfo(int id, string name, int hp, int atk, int def) {
    this.id = id;
    this.name = name;
    this.hp = hp;
    this.atk = atk;
    this.def = def;
    }
    }
    }



    このコードだとstruct EnemyInfo~ ってところが構造体になります。

    EnemyInfoにてそれぞれ、ID 名前 HP atk defという変数を管理しています。

    Startで構造体にデータを入れて、Debug,Logで出してます。

    これって・・・・クラスでもいいのでは?と思ってしまいますが

    [Blog0327.cs]

    using UnityEngine;

    public class Blog0327 : MonoBehaviour
    {
    private void Start() {
    EnemyInfo enemy = new EnemyInfo(1, "モンスター", 100, 10, 8);
    Debug.Log(enemy.name + " " + enemy.hp);

    EnemyInfo2 enemy2 = new EnemyInfo2(1, "モンスター", 100, 10, 8);
    Debug.Log(enemy2.name + " " + enemy2.hp);
    }

    struct EnemyInfo {
    public int id;
    public string name;
    public int hp;
    public int atk;
    public int def;
    public EnemyInfo(int id, string name, int hp, int atk, int def) {
    this.id = id;
    this.name = name;
    this.hp = hp;
    this.atk = atk;
    this.def = def;
    }
    }

    public class EnemyInfo2 {
    public int id;
    public string name;
    public int hp;
    public int atk;
    public int def;
    public EnemyInfo2(int id, string name, int hp, int atk, int def) {
    this.id = id;
    this.name = name;
    this.hp = hp;
    this.atk = atk;
    this.def = def;
    }
    }
    }



    もちろんクラスでEnemyInfo2をつくってやっても同じ結果になります。

    結局構造体って使わないのでは?

    Microsoftさんがクラスを使うか、構造体を使うかの判断基準を書いてくれています。
    https://learn.microsoft.com/ja-jp/dotnet/standard/design-guidelines/choosing-between-class-and-struct

    なんかいまいちわかりにくいですが、有効期間が短いやつとか、他のオブジェクトに埋め込まれることが多い場合は構造体を使うのがいいらしいです。

    ちなみにUnityのVector3とかintとかって構造体らしいです。

    構造体の簡単な紹介でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】 yield return StartCoroutine を StopCorutine するとき 

    こんにちは。
    大坂です。

    今日も宣伝から!
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    さて、yield return StartCoroutine を StopCorutine したい時ってありますよね。
    前から使ってたような気がしますが、なんかパッとやり方を思い出せなかったので…。

    ①Coroutine を使用する方法

    bool isLoop;
    Coroutine testCoroutine;

    IEnumerator Start() {
    btnTest.onClick.AddListener(OnClickStop);
    // Coroutine 変数に StartCoroutine を設定
    testCoroutine = StartCoroutine(TestCorutine());
    // フラグが false になるまで待つ
    yield return new WaitWhile(() => isLoop);
    Debug.Log("Stopしたよ");
    }

    public IEnumerator TestCorutine() {
    isLoop = true;
    while(isLoop) {
    yield return null;
    }
    }

    public void OnClickStop() {
    isLoop = false;
    }


    ②IEnumerator を使用する方法

    bool isLoop;
    IEnumerator testIEnumerator;

    IEnumerator Start() {
    btnTest.onClick.AddListener(OnClickStop);
    testIEnumerator = TestCorutine();
    yield return StartCoroutine(testIEnumerator);
    Debug.Log("Stopしたよ");
    }

    public IEnumerator TestCorutine() {
    isLoop = true;
    while(isLoop) {
    yield return null;
    }
    }

    public void OnClickStop() {
    isLoop = false;
    }


    最近直したときはCoroutineを使用する方法でやりましたが、
    IEnumerator を使用する方が修正少なかったなぁと思い、忘れないようにメモです。

    ではまたノシ

    Category: Androidアプリ紹介

    tb 0 : cm 0   

    【ハルシオンブログ】UnityでSelectionって機能つかってみた。ヒエラルキーのオブジェクト選択状態をセーブロードできる機能。 

    こんにちは。花粉で目も鼻もやられている月曜日。坂内っす。
    そういえば明日休みなんですね。
    飛び石連休とかって言葉久しぶりに聞きました。

    ええ、ええ

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

    もちろん今日もポケガの宣伝から入りますよ。
    育成シミュレーションゲームになってます。興味を持たれたら遊んでやってください。


    UnityでSelectionって機能使ってますか?
    オブジェクトを選択している状態をセーブロードする感じの機能です。

    例えばCubeとSphereの2つのオブジェクトがある時、Cubeを選択している状態で「Ctrl+Alt+1」を押します。



    次にSpereを選択している状態で「Ctrl+Alt+2」を押します。



    Ctrl+Alt+番号
    でその番号に保存という感じです。

    このあとに「Ctrl+Shift+1」や「Ctrl+Shift+2」を押すと、それぞれ保存した番号の「選択している状態」をロードします。



    こんな感じに、マウスで選択しなくても選択している状態をセーブロードできます。

    機能としては、Edit>Selectionを見ると出てきますが、最大で10個まで保存できるようですね。




    画面がごちゃごちゃしてきて、何回も同じオブジェクトを繰り返し選択するようなことがある場合は、とても便利な気がします。

    ということで、今まで使ったことなかったけど、こんな機能があるんだねっていう紹介でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityで複数種別のファイルが混在しているフォルダから特定の種別だけ選択する方法 

    こんにちは。
    大坂です。

    花粉なのか季節の変わり目なのかで体調を崩していますが、皆様大丈夫でしょうか?
    今日もポケットガール~受け継がれし希望~の宣伝から。
    少しでも興味を持ってもらえたらDLしてもらえると助かります!

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

    PV:


    では、ここからUnityのお話。
    Unityで1個のフォルダの中にTextureやらPrefabやらごちゃごちゃ入っていて、
    その中からTextureだけを選択したい時とかありますかね?
    フォルダ分けとちゃんとしていればそういうことはないと思いますが、僕はこの前ありました…。

    プロジェクトでタイプ検索してTextureだけにできたりもしますが、
    色々Assetとかを入れていると選択したくないものも検索対象になってしまうので、このときは使えませんでした。

    で、別の方法ないかなーとUnity触ってたら、こんな感じでできましたというお話。

    フォルダの中がこんな感じで、フォルダ内のファイルを全部選択したら、InspectorでTextureを選ぶだけ。


    ちゃんとTextureだけが選択されます。


    あんまり複数種別のファイルを混在させることはないと思いますが、
    簡単に特定の種別だけ選択できるので、何かの時にはぜひ使ってみてください。

    ではでは今週もこれにてノシ

    Category: Androidアプリ紹介

    tb 0 : cm 0   

    【ハルシオンブログ】Unityでオブジェクトの一覧を作成し、アイテムをタップすると選択中的なオブジェクトを表示する方法 

    少し暖かくなってきました。
    その代わり花粉が暴れてきた今日この頃。
    目がかゆい坂内です。

    ポケットガール好評リリース中。
    是非遊んでやってください。

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

    宣伝から入りました。


    さて、Unityのお話。
    Unityでアイテムのリストを作成し、タップで選択中というオブジェクトをそのリストアイテムに出す。

    こんな感じのことをしたい時。




    こんな感じで作ってますよという紹介です。
    (もっと簡単な方法あると思います)

    アイテムを並べるためのスクロールビューを作成。
    スクロールの必要もないんだけど、いっぱい並べた時用にスクロールにしてみた。



    そしてCanvasに以下コードをくっつける。
    [Blog0313.cs]

    using System.Collections.Generic;
    using UnityEngine;

    public class Blog0313 : MonoBehaviour
    {
    [SerializeField] ListItem listItemPref;

    [System.Serializable]
    public class Item {
    public int itemCd;
    public string itemName;
    }
    List<Item> items = new List<Item>();
    List<ListItem> listItems = new List<ListItem>();

    [SerializeField] Transform trnItemPlace;

    int currentItemIndex;

    private void Start() {
    // アイテムのデータを10個生成
    for (int i = 0; i < 10; i++) {
    Item item = new Item();
    item.itemCd = i;
    item.itemName = "Item" + i;
    items.Add(item);
    }

    // アイテムを生成
    foreach (Item item in items) {
    ListItem listItem = Instantiate(listItemPref, trnItemPlace, false);
    listItem.Setup(item, SelectItem);
    listItems.Add(listItem);
    }
    }

    ///

    /// アイテムを選択する処理
    /// </summary>
    /// <param name="i"></param>
    void SelectItem(int i) {
    currentItemIndex = i;
    // リスト更新
    foreach (ListItem listItem in listItems) {
    listItem.CheckSelect(currentItemIndex);
    }
    }
    }




    次に、リストのアイテムPrefabを作成。



    このItemには以下のコードを張り付けます。

    [ListItem.cs]

    using UnityEngine;
    using UnityEngine.UI;
    using TMPro;
    using System;

    public class ListItem : MonoBehaviour
    {
    [SerializeField] TextMeshProUGUI lblItemName;
    [SerializeField] Button btnSelect;
    [SerializeField] GameObject objSelector;

    int itemCd;

    public void Setup(Blog0313.Item itemData, Action<int> SelectItem) {
    objSelector.SetActive(false);

    lblItemName.text = itemData.itemName;
    this.itemCd = itemData.itemCd;

    btnSelect.onClick.AddListener(() => SelectItem(itemData.itemCd));
    }

    ///

    /// 選択中マーク更新処理
    /// </summary>
    /// <param name="index"></param>
    public void CheckSelect(int index) {
    if (itemCd == index) {
    objSelector.SetActive(true);
    } else {
    objSelector.SetActive(false);
    }
    }
    }



    こんな感じの処理をしてみる。

    実行するとこんな感じ。



    選択した際に、選択されてるindexを各リストのオブジェクトに渡して、自分のindexと同じやつだけ選択中のオブジェクトを表示、違う場合は選択中のオブジェクトを非表示しているだけ。
    特に何も考えないで作るとこんな感じでできます。

    ということで、メモ的な感じでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】マルチタッチの禁止【ポケガ3よろしくね】 

    こんにちは。
    大坂です。

    花粉が飛びまくってますが、皆様大丈夫でしょうか?
    自分はダメそうですorz

    さて、Unity全体でマルチタップを禁止したいときのお話。
    1行で終わる話なのですが…。

    これを書くだけです。

    Input.multiTouchEnabled = false;


    https://docs.unity3d.com/ja/current/ScriptReference/Input-multiTouchEnabled.html

    デフォルトでは有効になっているので、無効にしたい場合はこれを書いてあげる必要があります。
    マルチタッチの必要がないアプリはこれをやっておけば大丈夫そうです。

    ポケットガール~受け継がれし希望~ リリース中です!
    よろしくお願いします!!

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

    PV:


    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ポケガよろしくお願いします!あ、今日はisNullOrEmptyのお話。 

    花粉が舞いまくってますね。
    鼻水ずびずびです。坂内っす。

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


    さてUnityの基礎的な話。
    IsNullOrEmptyって使ってますか?
    stringがNullか空の時にTrueを返す関数です。


    void Start() {
    string strA = null;
    string strB = "";
    string strC = "abc";

    if (string.IsNullOrEmpty(strA)) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(strA);
    }
    if (string.IsNullOrEmpty(strB)) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(strB);
    }
    if (string.IsNullOrEmpty(strC)) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(strC);
    }
    }


    こんなコードを書くと結果はこうなります。

    Nullか空です
    Nullか空です
    abc


    ちゃんとNullでも空文字でも認識してくれてますね。

    stringだけじゃなく、ListでもNullかどうかの判断がしたい!
    って時はこんなクラスを作るといいらしいです。


    using System.Collections.Generic;

    static class CollectionExt {

    public static bool isNullOrEmpty(this ICollection collection) {
    return (collection == null || collection.Count == 0);
    }
    }

    public static string RetString(this ICollection collection) {
    StringBuilder strBuilder = new StringBuilder();
    foreach (T t in collection) {
    strBuilder.Append(t.ToString());
    }
    return strBuilder.ToString();
    }



    クラス名は適当です。

    これを使うコードを先ほどのStartに続けて書いてみます。


    void Start() {
    string strA = null;
    string strB = "";
    string strC = "abc";

    if (string.IsNullOrEmpty(strA)) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(strA);
    }
    if (string.IsNullOrEmpty(strB)) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(strB);
    }
    if (string.IsNullOrEmpty(strC)) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(strC);
    }

    List lstStr1 = new List{"あ", "い", "う", "え"};
    List lstStr2 = null;
    List lstStr3 = new List();

    if (lstStr1.isNullOrEmpty()) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(lstStr1.RetString());
    }
    if (lstStr2.isNullOrEmpty()) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(lstStr2.RetString());
    }
    if (lstStr3.isNullOrEmpty()) {
    Debug.Log("Nullか空です");
    } else {
    Debug.Log(lstStr3.RetString());
    }
    }



    結果はこんな感じ。

    Nullか空です
    Nullか空です
    abc
    あいうえ
    Nullか空です
    Nullか空です

    ちゃんとNullか空か、もしくは中身が入っているのかとれてますね。

    ということで、簡単にですが、isNullOrEmptyの使い方の紹介でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】アカウント作ったらアカウント消せるようにしろというリジェクト【ポケガ3DLしてください!!】 

    こんにちは。
    大坂です。

    ちょくちょくポケットガール~受け継がれし希望~のバグなど直していますがDL数が伸びませんね。
    皆さまDLしていただけると嬉しいです。

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

    PV:


    さて、ブログのネタです。

    Appleにアカウント作る機能あるなら消す機能も付けておけよというリジェクトをされたお話。
    確かにPlayfabでアカウント作ってますが、他のプロジェクトにかかわったときは言われなかった…。

    こちらクライアントからPlayfabのAdminAPI使ったり、Azure使ったりと方法ありますが、お手軽にCloudScriptでも一応できるので紹介。

    「https://{PlayfabのTitleID}.playfabapi.com/Admin/DeleteMasterPlayerAccount」というのがあるのでこれで消せるみたいです。
    headersに「X-SecretKey」、Bodyに「PlayFabId」を入れて投げるとアカウントが消せます。

    実行するだけの例としてはこんな感じ

    var headers = {
    "X-SecretKey": {Playfabで作成したシークレットキー}
    };
    var body = {
    PlayFabId: currentPlayerId
    };
    //DeleteMatserPlayerAccount
    var url = "https://{PlayfabのTitleID}.playfabapi.com/Admin/DeleteMasterPlayerAccount";
    var content = JSON.stringify(body);
    var httpMethod = "post";
    var contentType = "application/json";
    var response = http.request(url, httpMethod, content, contentType, headers);
    return { responseContent: response };
    }

    これを実行してあげるとアカウントを消すことができます。
    これでいいのかというのはわかりませんが…。

    なんかリジェクトされたという人は参考にしてみてください。
    実際はAzureとかでやったほうが情報もあったりするのでいいかもしれません。

    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0