FC2ブログ
10 «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.» 12

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

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

 

【ハルシオンブログ】ListでほしいものをFindするときに、まとめてとる方法や、Findの複数条件が使えることについて 

こんにちは!坂内っす。

UnityでList使ってますか?

List<クラス>

で、指定クラスのオブジェクトがいっぱい入るリスト作れますよね。

よく使ってます。

例えばこんなクラスがあるとします。

【AAA.cs】

public class AAA
{
public int aaaNo;
public int aaaType;
public string aaaName;
}


で、こんな感じで3個のAAAオブジェクトがListに入れます。


using System.Collections.Generic;
using UnityEngine;

public class Scripts20190708 : MonoBehaviour
{
List aaaAry = new List();
void Start()
{
AAA a0 = new AAA();
a0.aaaNo = 0;
a0.aaaType = 0;
a0.aaaName = "あいうえお";
aaaAry.Add(a0);

AAA a1 = new AAA();
a1.aaaNo = 1;
a1.aaaType = 0;
a1.aaaName = "かきくけこ";
aaaAry.Add(a1);

AAA a2 = new AAA();
a2.aaaNo = 2;
a2.aaaType = 1;
a2.aaaName = "さしすせそ";
aaaAry.Add(a2);
}
}


以前の記事で、Findを使って1つのオブジェクトを取り出すっていうのはやっています。


例えば「aaa.Noが2のモノを取り出す」って場合はこんな感じ


AAA no2Object = aaaAry.Find(x => x.aaaNo == 2);


これで、a1として入れたものが取り出せます。

では「aaaTypeが0のモノをすべて」取り出すにはどうすればいいでしょうか?


List allType0Obj = aaaAry.FindAll(x => x.aaaType == 0);


こんな感じで複数のモノも取れます。

また、複数の検索条件ももちろん使うことができます。


AAA no2Type1Obj = aaaAry.Find(x => x.aaaNo == 2 && x.aaaType == 1);


これであなたもFindマスター(だったらいいよね)


ってことで、是非ListとFindをご使用ください。多様していいのか分かりませんが!

あでゅ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】UnityというかC#のListについて。最近使った親Listへの代入方法。 

こんにちは。坂内っす。

今日はListについて。

ゲームを作っていると、同じクラスなどをまとめて格納したい時ってありますよね。

配列でもいいんですが、配列だと要素数増やしたりするのがめんどいので最近はいつもListを使ってます。

intなんかも入っちゃう優れもの。

    private void Start() {
List<int> intList = new List<int>();
intList.Add(11);
intList.Add(8);
intList.Add(2);
}


作ったクラスもなんでも入っちゃう

using System.Collections.Generic;
using UnityEngine;

public class ListTest : MonoBehaviour {

public class TestClass {
public int no;
public string moji;
}

private void Start() {
List<int> intList = new List<int>();
intList.Add(11);
intList.Add(8);
intList.Add(2);

List<TestClass> testAry = new List<TestClass>();
TestClass item1 = new TestClass();
item1.no = 0;
item1.moji = "あいうえお";
testAry.Add(item1);

TestClass item2 = new TestClass();
item2.no = 1;
item2.moji = "かきくけこ";
testAry.Add(item2);
}
}


Find関数を使うと、このListから「特定条件のものだけ取り出す」などの処理も簡単にできます。

【検索】

public class TestClass {
public int no;
public string moji;
}

private void Start() {
List<int> intList = new List<int>();
intList.Add(11);
intList.Add(8);
intList.Add(2);

List<TestClass> testAry = new List<TestClass>();
TestClass item1 = new TestClass();
item1.no = 0;
item1.moji = "あいうえお";
testAry.Add(item1);

TestClass item2 = new TestClass();
item2.no = 1;
item2.moji = "かきくけこ";
testAry.Add(item2);

// 検索
TestClass findItem = testAry.Find(x => x.no == 0);
Debug.Log(findItem.moji);


"あいうえお"が表示されます。

Findの中で検索をしています。
これが条件。ラムダ式を使う感じです。

「x => x.no == 0」

【継承クラスの格納】
子供のクラスを格納までは簡単です。

    public class ParentClass {
public int no;
public string moji;
}

public class ChildClass : ParentClass {
public string name;
}

public class ChildClass2 : ParentClass {
public string name2;
}

private void Start() {
ChildClass child = new ChildClass();
child.no = 0;
child.moji = "ああ";
child.name = "チャイルド";

ChildClass2 child2 = new ChildClass2();
child2.no = 1;
child2.moji = "いい";
child2.name2 = "チャイルド2";

List<ParentClass> parentAry = new List<ParentClass>();
parentAry.Add(child);
parentAry.Add(child2);
}


ほら、普通に入る。

それでは、ChildとChild2のListを別々に作ってParentのListへ代入する場合は?

    public class ParentClass {
public int no;
public string moji;
}

public class ChildClass : ParentClass {
public string name;
}

public class ChildClass2 : ParentClass {
public string name2;
}

private void Start() {
List<ChildClass> childAry = new List<ChildClass>();
ChildClass child1_1 = new ChildClass();
child1_1.no = 0;
child1_1.moji = "ああ";
child1_1.name = "チャイルド1-1";
childAry.Add(child1_1);

ChildClass child1_2 = new ChildClass();
child1_1.no = 1;
child1_1.moji = "あああ";
child1_1.name = "チャイルド1-2";
childAry.Add(child1_2);

List<ChildClass2> child2Ary = new List<ChildClass2>();
ChildClass2 child2_1 = new ChildClass2();
child2_1.no = 0;
child2_1.moji = "いい";
child2_1.name2 = "チャイルド2-1";
child2Ary.Add(child2_1);

ChildClass2 child2_2 = new ChildClass2();
child2_2.no = 0;
child2_2.moji = "いいい";
child2_2.name2 = "チャイルド2-2";
child2Ary.Add(child2_2);

List<ParentClass> parentAry = new List<ParentClass>();
parentAry = childAry;
}


これエラー出ます。

そのままでは代入できないんですよね。

そこで使うのがこれ。
parentAry = childAry.Cast<ParentClass>().ToList();


Cast<親クラス>().ToList();

これを使うことで、親クラスにキャスト(型変換)して親のListに入れることができます。
※Cast関数を使うには、using System.Linq;が必要になります。

どこで使うかはわかりませんが、今作ってるゲームでこれ使う機会あったので簡単に紹介しておきました。

それでは あでゅ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】UnityでGradleとProGuardを使ったビルドをしないといけなかった。 

こんにちは。
大坂です。

さて、今日もあんまりネタがないのですが。
タイトルの通りUnityでGradleとProguardを使用してビルドした話。

設定はこの辺をいじればGradleとProguardを使用したビルドになりますね。
使用しているのは「Unity2017.3.0f3」です。




設定すると自動でファイルが作られます。


この方法でビルドしたことがなかったので、色々エラーが出てビルド通すのも大変でしたが、
この辺使い慣れてる人は楽なんですかね?

メモがてらにエラーの対処方法
「Warning:」で止まる場合。
こんなやつね。

Warning: okio.DeflaterSink: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement


調べると警告だからProguardのファイルに「-dontwarn」で指定して無視しろっていうのがよく出てきます。
本当に無視だけでいいのかは謎なところもありますが、こんな感じで指定すると「Warning」も消えてきます。

-dontwarn okio.**


あとは既存プロジェクトでこの方法にしたので色々ライブラリが入っていて、Duplicate系のエラーも出ましたが、
この辺はエラーを見て被ってるのを削除すれば対応できました。

で、何とかビルドだけ通すと今度はAdmobがでねぇぇぇぇ!とかって嵌ります(ぇ
調べると難読化しないようにしようねってちゃんと書いてありました。
https://developers.google.com/mobile-ads-sdk/kb/?hl=ja#proguard

Unityでやってると?こんな実機のログにこんなエラーも出るので

AndroidJavaException: java.lang.ClassNotFoundException: com.google.unity.ads.UnityAdListener


追加でこの指定もしました。

-keep class com.google.unity.** {
public *;
}


あとはアドフリくんの動画なんかも使ってましたが、マニュアルを見るとそれぞれの会社の設定のところとかで、
Proguardの設定について書かれているので、設定を追加したら無事動画が再生されました。

やったことない方法でビルドするといろいろ嵌るよね!っていう話とメモでした
ではまたノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

Listの値の取り出し方ね…。おじさん新しい書き方とかついていけてません…orz 

こんにちは。
大坂です。

なんかまた、猛烈な腹痛に襲われていますが、よくあることと思って気にしないでおきます(ぇ

皆さんListに入れた値の取り出しとかどうやってますかね。
どうにも今までやってた方法でできると他を調べないタイプなのでforで回して一致してたの取ってたんですけど、
そんなこと書かなくても取れるんですね…。

とりあえずコード。
    class Item {
public int item_no;
public string item_name;
}

List list = new List();

void Start () {
// 適当に値を入れる
for(int i = 0; i < 10; i++) {
Item item = new Item();
item.item_no = i;
item.item_name = "item_" + i;
list.Add(item);
}

int ran = Random.Range(0, list.Count);

Item resultItem_1;
// forで取得(今まで)
for(int i = 0; i < list.Count; i++) {
if(ran == list[i].item_no) {
resultItem_1 = list[i];
Debug.Log(resultItem_1.item_name);
break;
}
}

Item resultItem_2;
// Findを使用して取得
resultItem_2 = list.Find(a => a.item_no == ran);
Debug.Log(resultItem_2.item_name);

}

ちゃんと同じ結果が取れますね(当たり前
ラムダ式的な書き方がどうにも苦手なのであんまり調べたり使ったりしてませんでしたが、
コード量も減りますしこっちの方がいいですかね。

上のコードでitem_noが重複してるときは先に入れた方がとれました。
まぁ一意ので探すとは思いますが一応ってことで。

ということでこんな書き方もあるよってことでした。

ではまたノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【Unity】オブジェクトの下にあるオブジェクト消しちゃおうぜ? 

おはようございますん!
げろ寒いっす!坂内っす!

先週の月曜のブログで新しいゲームのテスター(と、いってもちょこっと触ってもらって感想もらうだけのもの)を募集してました。
一応人数はそろってますが、ゲームがそろってないですorz
21日か28日かって言ってましたが、予想通り28日になりそうな・・・
いや、その前に終わればapkだしちゃうんですけどね!

ちょっと、チュートリアルをどうやって作ろうか悩んでいて・・・・ほんと分からんorz

今日のお話はちょっとしたメモ程度です。

とあるオブジェクトの下に、大量にオブジェクトを作成した後、全部消したいって時ありません?
リスト的なモノ作って、ページ切り替えとかでリストの中身全部消すとかに使うんですが。

- listObj
 |- item
 |- item
 |- item
 |- item
 |- item
 |- item

itemにタグがついていれば、以下のようにバババッと消せますよね。

	GameObject[] items = GameObject.FindGameObjectsWithTag("タグ名");
foreach(GameObject item in items){
Destroy(item);
}


では、以下のような時、且つlistObjの下のitemだけ消したい場合。
(Aitem、Bitemにはタグはついていない)

- listObj
 |- item
 |- item
 |- item
 |- Aitem
 |- Bitem
- listObj2
 |- item
 |- item
 |- item

	foreach(Transform item in listObj.transform){
Destroy(item.gameObject);
}


はい、こうやって消せますん。
listObjの下にあるTransform全部取り出してきて、削除!

たぶん、これでできるはず!
タグとか関係なしです。

もちろんlistObjの下にある[タグ名]タグがついているものだけ消すこともできます。
	GameObject[] items = listObj.transform.FindGameObjectsWithTag("タグ名");
foreach(GameObject item in items){
Destroy(item);
}


かな?

結構まとめて消したりとかやりますよね!

ってことで、簡単なメモでした!

あでゅ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   
FC2 Management