FC2ブログ
11 «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.» 01

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

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

 

【ハルシオンブログ】ボタンの長押しとかが使えるButtonExが便利 

こんにちは。
大坂です。

だいぶ冬っぽい気温になりましたね。
しばらく暖かったので余計に寒く感じる気もします。

今週は人が作った便利なボタンの紹介。
ButtonExってやつ。
ここからダウンロードできます。
https://github.com/mob-sakai/ButtonEx

ボタンで長押しとか実装する時に自分で作らなくてよくなります。
インポートしてあげて、普通にボタンを作って、ボタンコンポーネントのところを右クリックすると、
「Convert To ButtonEx」っていうのがあるのでそれを選ぶとボタンが変わります。


こうかわりますね。


そのままだとクリックだけなのでEventTypeでHoldを追加してみます。


Holdが追加されました。


Holdが追加されるので後はClickとHold用のメソッド作って適当に設定してみます。
とりあえずログ出すだけ。
    public void Click() {
Debug.Log("Click");
}

public void Hold() {
Debug.Log("Hold");
}

1秒押して離すと。


Clickのほうも動きますね。
まぁこの辺は自分でいくらでも対応できるとは思いますが、離してクリックが反応するならと言った感じの適当対応。
    bool holdFlg = false;

public void Click() {
if(!holdFlg) {
Debug.Log("Click");
} else {
holdFlg = false;
}
}

public void Hold() {
Debug.Log("Hold");
holdFlg = true;
}

これで1秒押して離したタイミングではログにClickは出ませんね。
その後に普通にクリックしてたらちゃんとClickのログが出ます。

と、便利なのがあったので紹介でした!
ではまたノシ
スポンサーサイト

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】今週もちょこちょことC#の話・・・ 

こんにちは。
大坂です。

火曜とか暑くて、今日寒いですね・・・。
明日また暖かくなって土曜日から寒くなるという寒暖差が激しいので皆様体調にはお気をつけを。
僕はなんだか知りませんが、猛烈な腹痛です・・・orz

はい!今週もネタがないので適当なやつです!

①Null非許容型を許容型に
Nullが入らない方にNull入れられるようにするってやつですね。
DBとか使っててNullが入るときなんかは使うかも?まぁそんなデータ作らなければいいんですが。
型の前に?を書くだけです。
DateTime? date = null;
DateTime time = date.HasValue ? date.Value : DateTime.Now;


Null許容型にするとHasValue が使えるようになって基になる型の値が含まれるかどうかが判定できる感じらしいです。

②可変長引数
引数にparamsをつけるだけですね。
    void Start() {
Test("a");
Test("a", "b");
Test("a", "b", "c");
}

void Test(params string[] strArray) {
foreach(string str in strArray) {
Debug.Log(str); ;
}
}

こんな感じで使えるやつです。
見た目はスッキリしますが、コストは高いみたいなので、よく呼ばれる処理では使用しないほうがいいっぽいですけどね・・・。

③オプション引数
引数にデフォルト値を与えておくやつ
    void Start() {
Test();
Test(10);
}

void Test(int i = 0) {
Debug.Log(i);
}

指定しなかったら0で処理してくれます。
最近は後からメソッドに引数を追加するときによく使ってますかね。

ということで今日もこの辺でノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

【ハルシオンブログ】ボタンを押すと一定時間押せなくなるボタン。カウントダウンもつけてみたよ 

こんにちは。坂内っす。

今日はUnityでこんな感じの事をしたい時の方法。



ちょうど今作ってるゲームで「スキルを使用するとクールダウン中はスキルが再使用できない」的なことを作ってたので、紹介です。

まずは、CanvasにImageを置き、Buttonコンポーネントもつけます。
Imageの「Image Type」をFilledにして、「Fill Method」うぃRadial360にしておきます。



ついでに、残り時間を表示するTextも置いておきました。

んで、コードはこちら。
(いつも通り汚いコードですがあしからず)

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

public class Script20181203 : MonoBehaviour {
[SerializeField]
GameObject objButton; // Image+Buttonのオブジェクトをアサイン
[SerializeField]
Text lblText; // 残り時間を表示するTextオブジェクトをアサイン

Image imgButton;
Button btnButton;

// 何秒でボタンが再アクティブになるか
const int COUNT = 10;
int countTime;

// ただのタイマー
float timer;

private void Awake() {
imgButton = objButton.GetComponent<Image>();
btnButton = objButton.GetComponent<Button>();
}

/// <summary>
/// ボタンを押した時の処理
/// </summary>
public void OnClickButton() {
countTime = COUNT;
}

private void Update() {
timer += Time.deltaTime;
// 毎秒処理
if(timer > 1f) {
timer = 0f;
if(countTime > 0) {
countTime--;
lblText.text = countTime.ToString();
imgButton.fillAmount = 1 - (float)countTime / (float)COUNT;
btnButton.interactable = false;
} else {
lblText.text = "";
btnButton.interactable = true;
}
}
}
}


①ボタンを押した時にcountTimeをセット。
②Updateで1秒に1回、以下の処理をする。
 countTimeが0じゃない限り-1をして、秒数を表示。
 とともに、ImageのfillAmountを指定。
 また、カウント中はボタンのinteractableをFalseにすることで、ボタンを押せないように制御
 
やっているのはこれだけです。

これをベースに色々といじると面白いボタンとか作れそうですね!

ってことで、今日はここまで!あでゅ~ノシ

Category: 開発日記(Unity)

tb 0 : cm 0   

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

こんにちは。
大坂です。

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

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

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

例えば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