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

     

    【ハルシオンブログ】どのシーンから始めてもほしいGameObjectのお話 

    こんにちは。
    大坂です。

    もう四月も終わりですね。
    GWお休みで予定がある人たちは楽しんでください。
    僕は毎年恒例イベントだけやってきます。

    さて、今週の話題です。
    いろんなシーンを作って開発しているときに最初のシーンから引き継がれるGameObjectが
    途中のシーンから始めてもほしい場合と科ありますよね。

    現状こんな感じでシーンごとに持たせてなければ作るとかやってたりするんですが…。
        public GameObject hogePref;

    void Awake() {
    if (!GameObject.FindGameObjectWithTag("Hogehoge")) {
    Instantiate(hogePref);
    }
    }

    毎シーンのメインのスクリプトごとに持たせてるのであんまりよくないですかね?
    ということで、こんな方法があるんですねという紹介です。
    【Unity】ゲーム中に常時必要なGameObjectがどのシーンから始めても存在するようにしてみよう

    こんな感じでできるんですねー。
    勉強になります。

    ということで、紹介だけの適当なブログですが今週も終わりですよノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】NCMBの簡単な使い方。データの保存の仕方。公式のマニュアルみれば大体わかるとおもうけどね! 後編! 

    こんにちは。坂内っす。

    最近WoWのやりすぎで首と肩が痛いっす。

    さて、先週NCMBへのデータの保存方法を書きましたので、今回はNCMBへデータ保存したやつを持ってくる方法を簡単に紹介。

    【ハルシオンブログ】NCMBの簡単な使い方。データの保存の仕方。公式のマニュアルみれば大体わかるとおもうけどね!

    とりあえず今回はNCMBが勝手に一意のIDをデータ毎に振り分けてるものがあるので、それを使いたいと思います。

    前回登録したときの事覚えてますか?



    登録成功したときに ObjectIDというのを取ってきてますよね。
    ってことで、こいつをPlayerprefにでも突っ込んでおけば、次回読み込み時にそのIDを使ってデータを持ってこれます。

    では、前回のTestNCMBManagerをいじってみましょう。

    [TestNCMBManager.cs](赤文字が追加行)
    using UnityEngine;
    using UnityEngine.UI;
    using System.Linq;
    using NCMB;

    public class TestNCMBManager : MonoBehaviour {

    public InputField inpNameObj;
    public Dropdown drpAgeObj;
    public ToggleGroup tglSexCodeGroupObj;
    public InputField inpCommentObj;

    public void OnClickSubmit() {
    string name = inpNameObj.text;
    string age = drpAgeObj.options[drpAgeObj.value].text;
    string sex = tglSexCodeGroupObj.ActiveToggles().First().GetComponentsInChildren<Text>()
    .First(t => t.name == "Label").text;
    string comment = inpCommentObj.text;

    Debug.Log("名前:" + name + "\r\n年齢:" + age + "\r\n性別:"
    + sex + "\r\nコメント:" + comment);
    Write_NCMB(name,age,sex,comment);
    }

    private void Write_NCMB(string name,string age,string sex,string comment) {
    // TestDataObjectを生成
    NCMBObject testClass = new NCMBObject("TestDataObject");

    // オブジェクトに値を設定
    testClass["name"] = name;
    testClass["age"] = age;
    testClass["sex"] = sex;
    testClass["comment"] = comment;

    // データストアへの登録
    testClass.SaveAsync((NCMBException e) => {
    if(e != null) {
    Debug.Log("保存に失敗しました。\n ErrorCode : " + (string)e.ErrorMessage + "\n");
    } else {
    Debug.Log("保存に成功しました。\n objectId : " + (string)testClass.ObjectId + "\n");
    PlayerPrefs.SetString("ncmbtest", (string)testClass.ObjectId);
    }
    }
    );
    }
    }


    今回追加したのは赤文字のところです。
    データ保存が成功したときにPlayerprefにtestClassのObjectIDを保存しています。


    画面の方もいじっていきましょう。



    登録ボタンの下に読み込みボタンを配置してみました。
    動作としては、読み込みボタンを押したときに、一度データが保存されている場合のみ、データを読み込み、Debugで表示してみましょう。

    [TestNCMBManager.cs](赤文字が追加行)
    using UnityEngine;
    using UnityEngine.UI;
    using System.Linq;
    using System.Collections.Generic;
    using NCMB;

    public class TestNCMBManager : MonoBehaviour {

    public InputField inpNameObj;
    public Dropdown drpAgeObj;
    public ToggleGroup tglSexCodeGroupObj;
    public InputField inpCommentObj;

    public void OnClickSubmit() {
    string name = inpNameObj.text;
    string age = drpAgeObj.options[drpAgeObj.value].text;
    string sex = tglSexCodeGroupObj.ActiveToggles().First().GetComponentsInChildren<Text>()
    .First(t => t.name == "Label").text;
    string comment = inpCommentObj.text;

    Debug.Log("名前:" + name + "\r\n年齢:" + age + "\r\n性別:"
          + sex + "\r\nコメント:" + comment);
    Write_NCMB(name,age,sex,comment);
    }


    public void OnClickLoad() {
    string myObjectKeyId = PlayerPrefs.GetString("ncmbtest", "");
    if(myObjectKeyId != "") {
    // TestDataObjectクラスを検索するクエリ作成
    NCMBObject findObj = new NCMBObject("TestDataObject");
    findObj.ObjectId = myObjectKeyId;

    // データを検索
    findObj.FetchAsync((NCMBException e) => {
    if(e != null) {
    // 検索失敗
    Debug.Log("検索に失敗しました。" + e.ErrorCode);
    } else {
    string strData = "";
    strData += "名前:" + System.Convert.ToString(findObj["name"]) + "\r\n";
    strData += "年齢:" + System.Convert.ToString(findObj["age"]) + "\r\n";
    strData += "性別:" + System.Convert.ToString(findObj["sex"]) + "\r\n";
    strData += "コメント:" + System.Convert.ToString(findObj["comment"]) + "\r\n";
    Debug.Log(strData);
    }
    });
    } else {
    // 空の場合
    Debug.Log("データが保存されていません。いったんデータを保存してね!");
    }
    }

    private void Write_NCMB(string name,string age,string sex,string comment) {
    // TestDataObjectを生成
    NCMBObject testClass = new NCMBObject("TestDataObject");

    // オブジェクトに値を設定
    testClass["name"] = name;
    testClass["age"] = age;
    testClass["sex"] = sex;
    testClass["comment"] = comment;

    // データストアへの登録
    testClass.SaveAsync((NCMBException e) => {
    if(e != null) {
    Debug.Log("保存に失敗しました。\n ErrorCode : " + (string)e.ErrorMessage + "\n");
    } else {
    Debug.Log("保存に成功しました。\n objectId : " + (string)testClass.ObjectId + "\n");
    PlayerPrefs.SetString("ncmbtest", (string)testClass.ObjectId);
    }
    }
    );
    }
    }


    では、実行してみます。



    まだ上記コードを入れた後に登録していないので、こうなりますね。

    それでは一旦データを登録してから読み込んでみます。




    取れました!

    ●NCMBObject findObj = new NCMBObject("TestDataObject");
    で、TestDataObjectのテーブルを指定。

    ●findObj.ObjectId = myObjectKeyId;
    で、ObjectIDを指定。

    ●findObj.FetchAsync((NCMBException e) => {}
    で、NCMBにあるTestDataObjectのテーブルに接続し、上記指定ObjectIDのレコードにフェッチしてる感じですかね。

    ●findObj["name"] や findObj["age"]
    で、そのレコードのデータを実際にとってきてますね。

    今回はObjectIDを使用したフェッチでしたが、SQLのWhereみたいに色んな条件でデータを取ることも可能です。

    たとえばこんなデータがあったとき


    ageが「19」のデータを取りたいといった場合に、以下のような感じで取れます。

    //TestDataObjectを検索するクラスを作成
    NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject>("TestDataObject");
    //ageの値が"19歳"と一致するオブジェクト検索
    query.WhereEqualTo("age","19歳");
    query.FindAsync((List<NCMBObject> objList, NCMBException e) => {
    if(e != null) {
    //検索失敗時の処理
    } else {
    //ageが"19歳"の名前を出力
    foreach(NCMBObject obj in objList) {
    Debug.Log("名前:" + System.Convert.ToString(obj["name"]));
    }
    }
    });





    という感じでデータはとれるようです!

    ってことで、NCMBのお話後編はこれにて終了!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】非アクティブのゲームオブジェクトを取得したいときなんかの話 

    こんにちは。
    大坂です。

    花粉が激しい日とそうでもない日の差がよくわかりません。。

    さて今週ネタです。タイトルの通りですね。
    非アクティブにしたGameObjectをスクリプトで取得したいときのお話。
    条件によって自分で非アクティブにしたのに取得しようとしてエラーを出す無能を発揮したのでネタになりました。。

    ChildObjが非アクティブでスクリプトでアクセス。


    こんなのに

        void Start() {
    GameObject.Find("ChildObj").GetComponent<Image>();
    }

    ってやるとGameObjectが取得できずに「Null」になるので怒られますね。


    まぁ方法はいくらかあるんでしょうが、そのオブジェクトを保持できる構成だったら、
    こんな感じで持たせてしまえばアクセスできますね。


        [SerializeField]
    GameObject childObj;

    void Start() {
    childObj.GetComponent<Image>();
    }

    あとは、親オブジェクトから「FindChild」を使用しても取得できます。
    こんな感じですね。
        void Start() {
    GameObject.Find("ParentObj").transform.FindChild("ChildObj").GetComponent<Image>();
    }

    では今週も役に立たなそうですがまた!ノシ

    Category: Androidアプリ紹介

    tb 0 : cm 0   

    【ハルシオンブログ】NCMBの簡単な使い方。データの保存の仕方。公式のマニュアルみれば大体わかるとおもうけどね! 

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

    先週金曜あたりにこんなTLが流れていました。


    で、いざ話を聞いてみると、軽いソシャゲ並みの情報をDBに登録したいとのこと。
    いやいや、そんなのNCMBじゃなくてサーバにDB建ててやらんと!ってのが本音ですが、調べてみると、ハルシオンブログにNCMBという言葉は2回でているものの、使い方書いてなかったので、いいネタになるかと思い、本日簡単に紹介!

    最近でもないけどNCMBって言葉聞きません?
    (N)Nifty(C)Cloud(M)Mobile(B)Backend
    かな?あれ?そうなのかな?記憶で書いてます。

    ICBMでもICMBでもなんでもありません。

    ニフティーさんのクラウドでデータ管理とかができるよーってシステムですね。

    http://mb.cloud.nifty.com/

    うちもいくつかのアプリで使用しています。

    まずはこちらでユーザ登録しましょう。
    料金形態はいくつかありますが、BASICコースだと月200万回のAPIリクエストまで等の制限はありますが、無料で使えますね。


    【NCMBへの連携方法】
    ①まずはNCMB上でアプリを登録しましょう


    アプリを登録すると、アプリケーションキーとクライアントキーが決められます。
    こちらは後でアプリに連携する際に使用するので、おぼえt(いつでも見れます)

    ②SDKをもらおうよ
    アプリの登録が終わったら、NCMBのページの上部ドキュメントを押して、SDKダウンロードを選択します。
    基本的な使い方はこのドキュメントをみればわかるんですけどね。

    ③SDKのパッケージをUnityにいれまーす
    まっさらなプロジェクトにNCMBを入れるとこんな感じ。


    開くといっぱいでてくるので、写真は撮ってません。

    ④お試し画面作成


    簡単にこんな画面を作ってみます。

    で、こんなコードを書いてみます。
    [TestNCMBManager.cs]
    using UnityEngine;
    using UnityEngine.UI;
    using System.Linq;

    public class TestNCMBManager : MonoBehaviour {

    public InputField inpNameObj;
    public Dropdown drpAgeObj;
    public ToggleGroup tglSexCodeGroupObj;
    public InputField inpCommentObj;

    public void OnClickSubmit() {
    string name = inpNameObj.text;
    string age = drpAgeObj.options[drpAgeObj.value].text;
    string sex = tglSexCodeGroupObj.ActiveToggles().First().GetComponentsInChildren()
    .First(t => t.name == "Label").text;
    string comment = inpCommentObj.text;

    Debug.Log("名前:" + name + "\r\n年齢:" + age + "\r\n性別:"
    + sex + "\r\nコメント:" + comment);
    }
    }


    「登録するよ」ボタンを押すとこうなります。


    これをNCMBに登録してみましょう。

    ⑤まずはNCMBのオブジェクトを用意します
    空のGameObjectを作成し、オブジェクト名を「NCMBSettings」に変更します。
    そのオブジェクトに、Assets->NCMB->NCMBSettings.csのクラスを付けます。
    NCMBSettingsの「Application Key」と「Client Key」は①で作成したキーを入れておきます。


    ⑥NCMBにデータを登録するようにコードを変更
    [TestNCMBManager.cs]
    using UnityEngine;
    using UnityEngine.UI;
    using System.Linq;
    using NCMB;

    public class TestNCMBManager : MonoBehaviour {

    public InputField inpNameObj;
    public Dropdown drpAgeObj;
    public ToggleGroup tglSexCodeGroupObj;
    public InputField inpCommentObj;

    public void OnClickSubmit() {
    string name = inpNameObj.text;
    string age = drpAgeObj.options[drpAgeObj.value].text;
    string sex = tglSexCodeGroupObj.ActiveToggles().First().GetComponentsInChildren()
    .First(t => t.name == "Label").text;
    string comment = inpCommentObj.text;

    Debug.Log("名前:" + name + "\r\n年齢:" + age + "\r\n性別:" + sex
    + "\r\nコメント:" + comment);
    Write_NCMB(name,age,sex,comment);
    }

    private void Write_NCMB(string name,string age,string sex,string comment) {
    // TestDataObjectを生成
    NCMBObject testClass = new NCMBObject("TestDataObject");

    // オブジェクトに値を設定
    testClass["name"] = name;
    testClass["age"] = age;
    testClass["sex"] = sex;
    testClass["comment"] = comment;

    // データストアへの登録
    testClass.SaveAsync((NCMBException e) => {
    if(e != null) {
    Debug.Log("保存に失敗しました。\n ErrorCode : " + (string)e.ErrorMessage + "\n");
    } else {
    Debug.Log("保存に成功しました。\n objectId : " + (string)testClass.ObjectId + "\n");
    }
    }
    );
    }
    }


    データの保存は基本SaveAsyncで行う感じです。
    クラスとしてデータストアの名前(DBのテーブル名みたいなの)を決めます。
    NCMBObject testClass = new NCMBObject("TestDataObject");

    その後、項目と、中に入れるデータを用意します。
    testClass["name"] = name;
    testClass["age"] = age;
    testClass["sex"] = sex;
    testClass["comment"] = comment;

    で、testClass.SaveAsyncをすると…



    成功と出ました!!!

    これで、NCMBの方のデータストアを確認すると…




    簡単!これだけでデータの保存ができます!!

    他にもログインなどの機能もありますね。
    こちらは公式の方見て頂ければと。
    http://mb.cloud.nifty.com/doc/current/tutorial/tutorial_unity.html

    さぁ、これで君もNCMBダー!

    ってことで、簡単にですが、NCMBの使い方でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】リストの結合するメソッドがあるんすね。 

    こんにちは。
    大坂です。

    ネタがなさ過ぎてまた超小ネタですね。
    はい、ごめんなさい。

    タイトル通りですがリストの結合です。
    List.AddRangeメソッドってのがあってできるらしいですね。

    ということでこんな感じで型の同じリストを作って。
    結合してあげると簡単に結合できますね!
            List<int> list_1 = new List<int>() { 1, 2, 3 };

    List<int> list_2 = new ListL<int>() { 5, 6, 7, 10 };

    list_1.AddRange(list_2);

    foreach(int i in list_1) {
    Debug.Log(i);
    }

    結果


    まぁ使おうと思って結局使わなかったんですけどね…。
    ではまた…ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】GoogleAnalyticsを導入してみよう・・・あれ?今ってFirebaseのAnalyticsが普通なのかな?まぁいいや。 

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

    花粉がいまだに猛威を振るっております。
    皆さま鼻水にご注意下さい。

    さて、皆さまスマホアプリにGoogleAnalyticsとか入れてますか?入れてませんか?

    Analyticsって何さ。って方もいると思うので簡単に紹介。

    といっても、詳しくは公式を見てください。
    https://developers.google.com/analytics/?hl=ja

    簡単にいうと「スマホアプリのアクセス解析ツール」といった感じでしょうか。

    アプリに導入するのは簡単なので、是非試してみてください。

    さて、まずはGoogleAnalyticsを登録します。
    https://analytics.google.com/analytics/web/provision/?authuser=0#provision/SignUp/

    登録するとこんな感じの画面になります。



    (今回はテストアプリという名のアプリ名で登録しました。)

    さて、次にUnityにgoogleAnalyticsのPluginを入れます。

    https://github.com/googleanalytics/google-analytics-plugin-for-unity

    こちらからパッケージを落とします。

    上記から落とした圧縮ファイルを解凍し、「GoogleAnalyticsV4_nobitcode.unitypackage」を実行します。
    (bitcodeとかnobitcodeとかありますが、各アプリに対応したやつ入れればいいかと)

    さてさてさーて。

    分かりやすいように、こんな感じで2つのシーンを作ってみました。


    Canvasに次のスクリプトを付けます。
    [Scene1Manager.cs]
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Scene1Manager : MonoBehaviour {
    void Start () {

    }

    public void OnClickMoveScene() {
    SceneManager.LoadScene("Scene2");
    }
    }


    同じくScene2のほうにもScene2Manager.csを付けます。
    (Scene2Managerの中身は1と同じで、LoadSceneの中がScene1になってるだけです。)

    それではGoogleAnalyticsのオブジェクトを付けてみましょう。

    タグ「GAv4」を作成し、Assets->Plugins->GoogleAnalyticsV4->GAv4のオブジェクトにtag「GAv4」を指定します。
    Scene1Manager.csを以下のように変更。

    [Scene1Manager.cs]
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Scene1Manager : MonoBehaviour {
    public GameObject gav4Obj;

    void Start() {
    if(!GameObject.FindGameObjectWithTag("GAv4")) {
    Instantiate(gav4Obj);
    }
    // トラッキング
    GoogleAnalyticsV4.instance.LogScreen("Scene1");
    }

    public void OnClickMoveScene() {
    SceneManager.LoadScene("Scene2");
    }
    }


    gav4ObjにはAssets->Plugins->GoogleAnalyticsV4->GAv4のオブジェクトをアサインします。
    (今回Scene1とScene2を行ったり来たりするため、複数GAv4オブジェクトが作成されてしまうため、あえてInstantiateでやっていますが、タイトル画面などゲーム起動時に1回しか訪れないシーン等がある場合、はじめから配置しておく方が簡単です)

    GAv4オブジェクトにGoogleAnalyticsの設定をします。



    Androidトラッキングコードは、GoogleAnalyticsのトラッキングコードと書かれているやつです。
    今回Unityでもトラッキングできるようにするため、OtherTrackingCodeにもAndroidトラッキングコードと同じものを入れてます。

    これで実行してみると…

    GoogleAnalyticsのリアルタイムの項目でちゃんと取れるのが見れます。


    実際にはこのコードでどこのシーン(画面)を見ているかを取ることができます。
    GoogleAnalyticsV4.instance.LogScreen("Scene1");


    【イベントを取る】
    ボタンをScene2に作ります。


    Scene2Manager.csを改造します。

    [Scene2Manager.cs]
    using UnityEngine;
    using UnityEngine.SceneManagement;

    public class Scene2Manager : MonoBehaviour {
    void Start() {
    // トラッキング
    GoogleAnalyticsV4.instance.LogScreen("Scene2");
    }

    public void OnClickMoveScene() {
    SceneManager.LoadScene("Scene1");
    }

    public void OnClickTestButton() {
    // イベントトラッキング
    EventHitBuilder eventBuilder = new EventHitBuilder();
    eventBuilder.SetEventCategory("課金");
    eventBuilder.SetEventAction("テスト1購入");
    GoogleAnalyticsV4.instance.LogEvent(eventBuilder);
    }
    }

    テストボタンを押した際に、OnClickTestButtonが呼ばれるようにする。

    これを実行すると、次のようにGoogleAnalyticsでイベントも取れます。


    という感じで、簡単にAnalyticsを導入できます。

    今まで導入してない方、お試しあれ!

    導入しても、うちみたいに見方と使い方が分からないとあんまり意味ないですけどねっ!

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】iTunesConnectにipa上げた後にくるメールにMissing Info.plist keyがある。 

    こんにちは。
    大坂です。

    昨日は暑かったですが今日は気温が下がって過ごしやすそうですね。

    さて今日のネタです。
    まぁタイトル通りですが。

    ipaをあげた後にこんなメールが来ました。


    まぁそのままInfo.plistにキーが足りねぇよって話です。
    このメールの場合は、
    ・NSCalendarsUsageDescription
    ・NSCameraUsageDescription
    が足りないって言われてますね。

    ということでこんな感じで追加します。


    Information Property Listをクリックすると「+」ボタンが出るので押すと新しいキーが増えます。
    で増えたキーの上と下向いた▲のところ押してあげるとキーが選べるので対象のを選ぶ感じですね。
    最初カーソル合わせると「-」「+」ボタンが出てきて場所が変わるので少し注意ですかね。

    理由は自分で意識して使っている権限だったらそれを書けばいいかと思います。
    広告で使用しているものは「広告で使用しています」と科適当に書いておけば審査は通ります(ぇ

    ということで短いネタでしたっと。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ポケガ2中国版の状況 その2 (もうだめぽ…) 

    はい、こんにちは。
    zabosamaこと坂内です。

    さて、技術ネタよりもポケガ2中国版の動向が面白かったので、第2弾として状況報告。

    第1回目はこちら。

    リリースしたのは3月25日なので、かれこれ1週間経った感じですね。

    あ、リンクはこちらです。
    (中国語版なので、ここ見てる人にはあんまり関係ないかな?)

    Android:
    http://www.pujia8.com/library/10130/
    https://www.taptap.com/app/65750

    iOS:
    https://itunes.apple.com/cn/app/id1355600137


    前回の記事では、うおーDLのびてきたあーー ひゃっはーー って思ってたのですが、現状では 

    。゚(゚ `Д)ノ。ヽ(Д´ ゚)ノ゚。。゚ヽ(゚`Д´゚)ノ゚。ウワァァァン!!


    って状況。

    4日もしたらTAPTAPさんのランキングから消えてもうDLがありません ( ノД`)シクシク…

    【Android】

    一応下がってはいるものの、まだかろうじてDLされてる感じですね。

    次にiOS
    【iOS】


    あれ?TAPTAPさんではAndroid側はランキングに入らず、iOSだけランキングにいたのに...落ちるのはやーい( ノД`)シクシク…

    ということで…まだこれからかもしれませんが、現状の感じですと、ちょーつらい感じになっていきそうです…

    中国でも日本と同じくiOSユーザよりAndroidユーザの方が多いのが目につきますね。

    と、まぁ現状です。

    「1日10万DLいったよ!」
    とか記事ありましたが、日本のアプリと同じく、本当に一握りでございますな。

    人口多いから凄い期待してたんだけど、ポケガ2では力不足だったようです。

    何かを契機にどーんといってくれるといいのですが…

    ということで、本日は2回目のポケガ2中国語版の状況報告でした!

    あでゅ~ノシ

    Category: Androidアプリ紹介

    tb 0 : cm 0