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

 

【ハルシオンブログ】拡張メソッド使ってますか? 

こんにちは。
大坂です。

なんか朝から咳が止まりませんが、気のせいですよね・・・たぶんきっと・・・。

さて、皆さん拡張メソッドって使ってますか?
僕は使ってません(ぇ

何やら便利な感じもするのでちょっとだけ記事に。
まぁ他にもいっぱい記事がありますけどね。

例えばTransformのy座標だけ変えたいときとかこうは書けません。
 transform.position.y = 15;


エラーになりますね。
変えたいときはこんな感じで書いてあげないといけないです。
Vector3 pos = transform.position;
pos.y = 15;
transform.position = pos;


毎回こんなの書くのも面倒だし、なんか見難いし。
ということでこういうときは拡張メソッドを使うといいらしいです。

書き方はこんな感じ?
using UnityEngine;

public static class TransformExtensions {

public static void SetPosY(this Transform tran, float y) {
Vector3 pos = tran.position;
pos.y = y;
tran.position = pos;
}
}


staticクラスでstaticメソッドとして書きて、
第一引数の拡張してあげたいクラスであるTransformにthisをつけてあげます。

そうするとこんな感じで使えます。
 transform.SetPosY(15);


あ、ちゃんとVisual Studioの自動補完にも出てきます。


ということでちゃんと活用すると便利そうですね!
ってことで今週も終わり!
またノシ
スポンサーサイト

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】Prefabから複数Instantiateしてできたオブジェクトに●●したい時のやり方。とりあえず2パターンかいてみたけど、他にもいい方法ありますか? 

こんにちは。坂内っす。

Prefabを使ってInstantiateしたオブジェクトの管理について。

1つのPrefabを使って複数のオブジェクトを作った際に、指定番号(生成した順)のオブジェクトに対してアクション(消したり、処理を行ったり)をする場合のやり方。

デジゲーでお会いした杉田さんがこんなことをつぶやいていたので、ちょっと説明。


もう解決はしているようだけども。

いくつかやり方があると思うのですが、僕のやりかたを2つほど紹介。

まずは、ただ単にImageのプレハブを5個Instantiateして並べるだけのプログラム。



[Script20181126.cs]
using UnityEngine;

public class Script20181126 : MonoBehaviour {

[SerializeField, HeaderAttribute("アイテムをおくところ")]
private Transform itemsPlace;
[SerializeField, HeaderAttribute("アイテムプレハブ")]
private GameObject itemPref;

float[] itemPosiX = {-300f,-150f,0f,150f,300f };

private void Start() {
for(int i = 0; i < itemPosiX.Length; i++) {
GameObject item = Instantiate(itemPref, itemsPlace, false);
item.transform.localPosition = new Vector2(itemPosiX[i], 0f);
}
}
}


これをベースにボタンを押したら、「1番目のオブジェクトを消す」「5番目のオブジェクトの色を変える」をやってみましょう。


【オブジェクト名での管理】
オブジェクトに名前(番号付き)を付けて大元から色々いじったりする。

using UnityEngine;
using UnityEngine.UI;

public class Script20181126 : MonoBehaviour {

[SerializeField, HeaderAttribute("アイテムをおくところ")]
private Transform itemsPlace;
[SerializeField, HeaderAttribute("アイテムプレハブ")]
private GameObject itemPref;

float[] itemPosiX = {-300f,-150f,0f,150f,300f };

private void Start() {
for(int i = 0; i < itemPosiX.Length; i++) {
GameObject item = Instantiate(itemPref, itemsPlace, false);
item.name = "item_" + i;
item.transform.localPosition = new Vector2(itemPosiX[i], 0f);
}
}

public void OnClickButton() {
foreach(Transform itemTran in itemsPlace) {
if(itemTran.gameObject.name == "item_0") {
Destroy(itemTran.gameObject);
}
if(itemTran.gameObject.name == "item_4") {
itemTran.gameObject.GetComponent<Image>().color = new Color(1f,1f,0f,1f);
}

}
}
}


あ、もちろん次にやるようにオブジェクトの方で処理とかもできますが、なんか名前等の「Stringでの判定」ってあんまりやりたくないですよね。


【オブジェクトにもスクリプトを用意する方法】
番号で判定させるなら、文字列よりintとかで判断したい。(大文字小文字とかで合わなかったりをなくすため)
そして、オブジェクトがあるならそれ用のスクリプトで処理とかしたい。
そんなあなたへ。

Item側を触るスクリプトを1つ追加します。


[ScriptItem.cs]
using UnityEngine;
using UnityEngine.UI;

public class ScriptItem : MonoBehaviour {
private int itemNo;
public int ItemNo
{
get{ return itemNo; }
set{ itemNo = value; }
}

public void InitItem(int itemNo,float posiX) {
this.itemNo = itemNo;
transform.localPosition = new Vector2(posiX,0f);
}

public void DestroyItem() {
Destroy(gameObject);
}

public void ChangeColor() {
GetComponent<Image>().color = new Color(1f,1f,0f,1f);
}
}


[Script20181126.cs]
using UnityEngine;
using UnityEngine.UI;

public class Script20181126 : MonoBehaviour {

[SerializeField, HeaderAttribute("アイテムをおくところ")]
private Transform itemsPlace;
[SerializeField, HeaderAttribute("アイテムプレハブ")]
private GameObject itemPref;

float[] itemPosiX = {-300f,-150f,0f,150f,300f };

private void Start() {
for(int i = 0; i < itemPosiX.Length; i++) {
GameObject itemObject = Instantiate(itemPref, itemsPlace, false);
ScriptItem item = itemObject.GetComponent<ScriptItem>();
item.InitItem(i, itemPosiX[i]);

}
}

public void OnClickButton() {
foreach(Transform itemTran in itemsPlace) {
ScriptItem item = itemTran.gameObject.GetComponent<ScriptItem>();
if(item.ItemNo == 0) {
item.DestroyItem();
}
if(item.ItemNo == 4) {
item.ChangeColor();
}

}
}
}

こっちの方がスッキリしますよね?

ってことで、作ったオブジェクトへのアクションについてでした。あでゅ~ノシ

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
2018/11/28 追記 コメントにより、最適解?

[Script20181126.cs]
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Script20181126 : MonoBehaviour {

[SerializeField, HeaderAttribute("アイテムをおくところ")]
private Transform itemsPlace;
[SerializeField, HeaderAttribute("アイテムプレハブ")]
private GameObject itemPref;

private List<ScriptItem> itemList = new List<ScriptItem>();

float[] itemPosiX = {-300f,-150f,0f,150f,300f };

private void Start() {
for(int i = 0; i < itemPosiX.Length; i++) {
GameObject itemObject = Instantiate(itemPref, itemsPlace, false);
ScriptItem item = itemObject.GetComponent<ScriptItem>();
item.InitItem(i, itemPosiX[i]);
itemList.Add(item);
}
}

public void OnClickButton() {
itemList[0].DestroyItem();
itemList[4].ChangeColor();

}
}


あ。たしかにいつもこうやってるわ。

Category: 開発日記(Unity)

tb 0 : cm 2   

【ハルシオンブログ】今週も適当に小ネタを2個・・・! 

こんにちは。
大坂です。

ネタないねーないねー。
とりあえず今作ってるゲームの街の画面のツイートを坂内がしてましたね!
これね!


リリースした際にはダウンロードよろしくお願いしますね!
いつになるかは…うん。頑張って面白くなるように作っていきます!

で適当ネタ。
プロジェクトにあるテキストファイルにアクセスするとき。
Resourcesに.txtファイルを突っ込んでこんな感じで取得する
    TextAsset text = Resources.Load("test");
Debug.Log(text);

もしくはTextAssetの変数に持たせてインスペクターでアサイン設定する。
    public TextAsset textAsset;

private void Start() {
Debug.Log(textAsset);
}



まぁどっちでもちゃんとれますね。
使うかどうかは微妙な線ですか・・・ね?

これだけだとあれなんでもう1個ネタを…
「Script Execution Order」なんていう機能があるらしい。
適当にこんな風にスクリプトを2個作って、オブジェクトに張り付けて実行してあげると。
[Test_1.cs]
    void Awake() {
Debug.Log("Test_1のAwake");
}

void Start () {
Debug.Log("Test_1のStart");
}

[Test_2.cs]
    void Awake() {
Debug.Log("Test_2のAwake");
}

void Start() {
Debug.Log("Test_2のStart");
}

実行結果


新しく作られたTest_2のほうが先に実行されてますね。
で、これを逆にしたいときとかに使えます。
[Editor]-[ProjectSettings]-[Script Execution Order]ですね。


こんなのが出てくるので、+を押してスクリプトを追加していきます。




こんな感じになりますね。数字が小さいほうが先に実行されます。
この状態でさっきと同じように実行すると。


ちゃんとTest_1が先に出てますね!
まぁスクリプトが多くなりすぎると管理が大変ですけど。機能として知っていると何かの時に使えそうです。
あ、GUIで変えなくても.metaファイル見たら項目があるのでそこでも変えられますね。


という感じで今日も終わりですよノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】カメラエフェクトって色々あって面白いですね!アセット「CameraFilterPack」の紹介! 

こんにちは。坂内っす。

今回は超面白そうなアセットを発見したので、ご紹介。
基本アセットは使わない主義なんですが、こういうエフェクトとかそういうのは作れないので、頼るしかない。
でもほんとこれは凄いので見ていって!

「Camera Filter Pack」っていうやつです。

こいつは何かというと、すごい種類のカメラエフェクトが簡単に使えるようになります。
色々悩んでる方、エフェクトが欲しいかた必見!

こいつがベース


ただ、アニメーションを繰り返しているだけ。


これに色々なエフェクトをかけてみましょう。



雪ののエフェクト。


こんな血のエフェクトみたいのとか。


霧なんかも簡単にできますね。


水にもぬれたり。


もちろん、雨もあります。


こんなのもあります。


色々あって面白いですね!


とかとか!

色々紹介してみましたが、ここに書いたエフェクトはほんの一握りだけです。

お気に入りのエフェクトがあるといいですね!

ってことで是非使ってみてください! あでゅ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】SoftMaskScriptってやつをちょっと使ってみた。 

こんにちは。
大坂です。

急に寒くなってきましたね。
皆様体調にはお気をつけを。

uGUI(TextやImage)を簡単にトランジション的なマスクをするのに使える「SoftMaskScript」ってやつの紹介。

以下のダウンロードページでダウンロードできる
UnityUIExtensions.unitypackage」の中にある「SoftMaskScript」ってやつですね。
https://bitbucket.org/UnityUIExtensions/unity-ui-extensions/downloads/

他にもいろいろはいっていますが。とりあえず「SoftMaskScript」使ってみました。

使い方は簡単。
TextとかImageにAddComponentして、
AlphaMaskにテクスチャを設定してCutOffの数字をいじるだけですね。



※クリックすると動くよ

ちなみにスクリプトからいじる場合はこんな感じ。
using UnityEngine;
using UnityEngine.UI.Extensions;
using DG.Tweening;

public class Test : MonoBehaviour {

public SoftMaskScript txtMask;
public SoftMaskScript imgMask;

// Use this for initialization
void Start() {
DOTween.To(() => txtMask.CutOff, (n) => txtMask.CutOff = n, 1, 2f).SetLoops(2, LoopType.Yoyo);
DOTween.To(() => imgMask.CutOff, (n) => imgMask.CutOff = n, 1, 2f).SetLoops(2, LoopType.Yoyo);
}


※クリックすると動くよ

なんか簡単なのに使えるかもしれませんね!
ではまたノシ

Category: 開発日記(Unity)

Tag: Unity  2Dゲーム  uGUI 
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   

【ハルシオンブログ】int → enum の変換とか最近使ったちょっとしたやつ? 

こんにちは。
大坂です。

今週も木曜日がやってきました。
そして今週もたいして書くことがありません!

ということで最近コーディングで使ったやつ。
相変わらず誰でも知ってそうなのでごまかしていきます(ぁ

とりあえず int → enum の変換について
今までこんな感じでしかできないと思ってたんですが、
enum RARITY {
UR,
SSR,
SR,
R,
N,
}

int num = 3;
RARITY rare = (RARITY)Enum.ToObject(typeof(RARITY), num);


これでもできるんですね。
RARITY rare = (RARITY)num;


なんか結構前にやった時にできなかった気がするけど気がしただけだったのか…。

次、ListのInsert…まぁ普通にあるやつですが最近初めて使いました。
Listの指定した場所に挿入するやつですね。
List blogList = new List();
blogList.Add("aaaa");
blogList.Add("bbbb");
blogList.Insert(1, "cccc");


とかってやると、
aaaa, cccc, bbbb
の順番になる。

リストの長さより長いところに挿入しようとするとエラーになります(当たり前?
List blogList = new List();
blogList.Insert(1, "cccc");



一応こんな感じでやると、ArgumentOutOfRangeExceptionが出ますね。

ということで今週も終わりです。
また~ノシ

Category: 開発日記(Unity)

Thread: プログラミング

Janre: コンピュータ

Tag: Unity  C#   
tb 0 : cm 0   

【ハルシオンブログ】デジゲー2018いってきたんよ。今回は写真いっぱいとってきたら、ブログ大変になるってわかったんよ。 

こんにちは。坂内っす。

昨日デジゲー博2018行ってきたっす。

2次会幹事もやったんだけど、55人も来てくれて嬉しいっす。
2年連続デジゲー後の飲み会幹事。
これは来年もやらないといけませんね。

そして、いつもこういうイベント行くと写真が少ない!少ないよ!って言われる(いわれてない?)ので、今回は写真いっぱいとってきたよ!

ほとんどが知り合いのブースだったりするんだけど。
そして写真とってゲームやらないの多いからなんのゲームか説明ができません。

3時間くらいであの数全部触りながら回るのは無理です。
ええ。
ボクの足腰も持ちません。

ってことで、とりあえずとってきた写真をばばばーっと並べてみますね。

それでは、デジゲー2018写真集開始!(※が付いてるのは朝の時点で知り合いブース)

【まずは腹を満たします。お昼はビールは我慢しました。えらいなおれ】



【無責任商会さんの"ガラクタファクトリー"※】



【お隣のブースもパシャリ(ターメリックさんのブースかな)】



【さらにお隣のブース(DeskWorksさん)もパシャリ


【おつぎはStrawberryBoseさんのブース】


【そしてしんさんのブースにもお邪魔しました※】


【お次はじぇふさん、未来さんのいるミライノ製作所※】


【あれ?はっぷさんがいるじゃ~ないですか。ちょうど子供達がいなくて暇そうにしてたので、突撃!※】


タノシマスのブースもありましたよ。
アカとブルーの展示が・・・・・あれ?タノシマスってインディーなの?デジゲーってなんだっけ?

【HSPのブースもありました。全然俺はHSPのこと知らないんですけどね・・・】


【そのお隣のブース(かな?)】


【でんぱゆーれいさんのブース】


【そしてほげた氏のブース※】


【からのー GUMIさん、やゆよさんの"Re:Arium"ブース※】


【その隣はtatsunoruさんの"DOFI LAB"ブース※】


おいおいこの辺知り合いブースが並びまくりじゃないですか!

【電光石火屋台さんの オカルトADVのブース】


【DAEDALUSブース】


【からの ニムさんのブース。ゲームとかじゃなくてスマホに付けて使えるコントローラのブース。凄い良くできてました!※】


【LemoLabさんのブース 小説共有サービスらしいです。】




【そしてnakajimaさんのブース※】


【隣はnaichiさんのブースですね※】


【杉田さんのブース。キャラ可愛いし、良いものができそうですね!】




【どなたのブースだろうか。なんか良さそうだったのでパシャリ】


【もとさんのブース※】


【お隣のブース。新潟からきた女の子二人組のブースでした】


【ねるらぼさんのブース。高評価のパズルゲームぽいっす!】


ほんとこの辺から写真だけ撮りながらの駆け足になりました。
むりむり。多いよ!

【UOZUプロジェクトにも参加していた、三日月さんのブース※】


【パッと見た目良さそうなゲームだったのでパシャリ】


【あのあっきーさんのブース&がんばるさんのブース※】






【あずまごろーさんのブース。素晴らしいカードゲーム※】


【我らがときねこさんのブース。ほんと毎回素晴らしいもの作るよね。売れればいいのに!※】




【そしてふりふらさんのブース。ぶり〇ねこはどこにいったのやら※】


【どなたのブースか失念。】


【まぼろしのおにさんのブース。なんかテーブルクロスから本格的!※】


【そして我らのPOPさんのブース!※】


【お隣はBranchさんのブースもありました。※】


【すごい良くできてるシューティングがあったのでパシャリ。ちなみに僕はシューティングは全然やりません】


【この辺はシューティングがおおいっす】


【そしてふとしさんのブース。あれ?去年もこれじゃなかったでしたっけ?※】


【ichijoさんのブース。ロボット対戦もののようです。操作良く分からなく4位でしたorz※】


【4人対戦ができる対戦ゲーム。戦ってる画面写真撮るの忘れたけど、AlienGamesの社長と対戦して勝ちましたv よくできてますよこれ!ネット対戦できるならぜひ製品版ほしいですね!】


【紙パレットさんの"ジラフとアンニカ"のブース。マジで良くできてるんすよこれ。お客さん多すぎて挨拶できなかったけどorz※】


【あちゃぼっくすさんのいるチームSke6のブース。】


ここから2Fから4Fに移ります。
もうこの辺で足痛いわ疲れたでぐだぐだに・・・

【なんか雰囲気ある出し物だったので、パシャリ】


【我らが住田さん率いるポラリスXさんのブース。ガチャで大当たり(住田さんの顔)がでて、中年騎士ヤスヒロとサリーの法則のストーリーコミックとかもらったよ!※】


【最後はキャラコネクトを制作中のn次元さんのブース。キャラコネクトではポケガ2の妹ちゃんを採用してもらってます!※】


一気に写真流してみました。

どこのブースもすごく良くできてて年々デジゲーの質が上がってるような気がする!

そしてこう見ると、ちゃんと知り合い以外のブースの写真も撮ってる!オレエライ

ってなわけで、今回は写真ばっかりだったけどデジゲー楽しみました!
また来年飲み会で会いましょう!(笑)

では、あでゅ~ノシ

Category: その他日記

tb 0 : cm 0   

【ハルシオンブログ】Androidでバックボタンでアプリを終了させるとき? 

こんにちは。
大坂です。

今日から11月ですね!
今年もあと2ヶ月です…orz

さて、今週もタイトル通りですが、Unityでアプリを作ったときのAndroidアプリのバックボタンのお話。
終わらせるだけならこんな書き方ができるよってだけですが。

とりあえず今までやってた方法。
void Update () {
if(Input.GetKeyDown(KeyCode.Escape)) {
Application.Quit();
}
}

これでバックボタン押すと終了します。
これを1行にできる。
void Start () {
Input.backButtonLeavesApp = true;
}

これでもバックボタンを押すとアプリが終了されますね!
簡単にアプリを終わらせたいだけならこれで十分な機能なので紹介でした。

では超絶に短いですが今週もこれにてノシ

Category: 開発日記(Unity)

Thread: プログラミング

Janre: コンピュータ

Tag: Unity  Android  ボタン 
tb 0 : cm 0