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