【ハルシオンブログ】ScriptableObjectを使う時の注意点。そのまま使うとマスタの値が変わっちゃうよ?
今日は素敵な天気ですね!こんな日は散歩がしたくなります!
まぁ しませんけど。坂内です。
以前ScriptableObjectの作成方法や、使い方を紹介しました。
【ハルシオンブログ】UnityでScriptableObjectを作成して、使う方法の紹介。なんか使いやすいように使ってください! 】
マスタデータ的な感じで使うことが多いかと思いますが、使う上で気を付けないといけない点があるので、紹介。
こんなデータを作成します。
【Enemy.cs】

これで、敵のデータ作成完了。
次に画面にボタンを置き、クリックすることで、敵に攻撃をする感じのを作ります。

【Script20190415.cs】
ボタンをクリックしたときにOnClickAttackを呼ぶようにします。
そうすると・・・・

えっ!
なんかおかしい・・・・
調べてみると、こうなっているのが分かります。

えー!マスタの値がかわってるうううううう!!!
これじゃマスタとしての意味なくなってしまいます。
これ、値渡しじゃなくて参照渡しだから起きちゃうんですよね。
なので、ScriptableObjectのオブジェクトを使う場合にはディープコピーにて使ってあげるといいと思います。
なんかいい方法あるのかもしれませんが、今のところこんな感じでやってます。
【Enemy.cs】
コピーメソッドを付けてあげます。
次にScript20190415.csのMakeNewEnemyメソッドを次のように変えます
こんな感じでやれば、ちゃんと動くようになります。

気を付けないと、マスタデータが書き換わってしまいます。
という感じで、今日はScriptableObjectを使う上での注意点でした。
あでゅ~ノシ
まぁ しませんけど。坂内です。
以前ScriptableObjectの作成方法や、使い方を紹介しました。
【ハルシオンブログ】UnityでScriptableObjectを作成して、使う方法の紹介。なんか使いやすいように使ってください! 】
マスタデータ的な感じで使うことが多いかと思いますが、使う上で気を付けないといけない点があるので、紹介。
こんなデータを作成します。
【Enemy.cs】
public class Enemy : ScriptableObject
{
public List enemys = new List();
[System.Serializable]
public class EnemyData {
public string name;
public int maxHp;
public int hp;
public int atk;
public Sprite image;
}
}

これで、敵のデータ作成完了。
次に画面にボタンを置き、クリックすることで、敵に攻撃をする感じのを作ります。

【Script20190415.cs】
using UnityEngine;
using UnityEngine.UI;
public class Script20190415 : MonoBehaviour
{
[SerializeField]
Enemy enemyMst;
Enemy.EnemyData currentEnemy;
// UI
public Text lblEnemyName;
public Text lblEnemyHP;
public Image imgEnemy;
private void Start() {
MakeNewEnemy();
}
public void OnClickAttack() {
// 攻撃ダメージ(10~30)
int atkDmg = Random.Range(10,31);
currentEnemy.hp -= atkDmg;
if (currentEnemy.hp <= 0) {
MakeNewEnemy();
return;
}
lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
}
private void MakeNewEnemy()
{
// 敵のデータをランダムで1体作成
currentEnemy = enemyMst.enemys[Random.Range(0, enemyMst.enemys.Count)];
lblEnemyName.text = currentEnemy.name;
lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
imgEnemy.sprite = currentEnemy.image;
}
}
ボタンをクリックしたときにOnClickAttackを呼ぶようにします。
そうすると・・・・

えっ!
なんかおかしい・・・・
調べてみると、こうなっているのが分かります。

えー!マスタの値がかわってるうううううう!!!
これじゃマスタとしての意味なくなってしまいます。
これ、値渡しじゃなくて参照渡しだから起きちゃうんですよね。
なので、ScriptableObjectのオブジェクトを使う場合にはディープコピーにて使ってあげるといいと思います。
なんかいい方法あるのかもしれませんが、今のところこんな感じでやってます。
【Enemy.cs】
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "EnemyData", menuName = "ScriptableObjects/MakeEnemyData")]
public class Enemy : ScriptableObject
{
public List<EnemyData> enemys = new List<EnemyData>();
[System.Serializable]
public class EnemyData {
public string name;
public int maxHp;
public int hp;
public int atk;
public Sprite image;
public void Copy(EnemyData enemyData)
{
this.name = enemyData.name;
this.maxHp = enemyData.maxHp;
this.hp = enemyData.hp;
this.atk = enemyData.atk;
this.image = enemyData.image;
}
}
}
コピーメソッドを付けてあげます。
次にScript20190415.csのMakeNewEnemyメソッドを次のように変えます
Private void MakeNewEnemy()
{
// 敵のデータをランダムで1体作成
currentEnemy = new Enemy.EnemyData();
currentEnemy.Copy(enemyMst.enemys[Random.Range(0, enemyMst.enemys.Count)]);
lblEnemyName.text = currentEnemy.name;
lblEnemyHP.text = currentEnemy.hp + "/" + currentEnemy.maxHp;
imgEnemy.sprite = currentEnemy.image;
}
こんな感じでやれば、ちゃんと動くようになります。

気を付けないと、マスタデータが書き換わってしまいます。
という感じで、今日はScriptableObjectを使う上での注意点でした。
あでゅ~ノシ
【ハルシオンブログ】Unityでのシーン間のデータの受け渡し…初心に戻ってみました。
花粉が飛び始めた感じですね。
今年もまた多いとか・・・つらい時期が始まりました。坂内っす。
ネタが思いつかないので、初心に戻って「シーンを跨いだデータの渡し方」をやってみましょう。
まずはシーンを2つ用意します。
●シーン1

●シーン2

やることは、「シーン1のインプットフィールドに文字を入力し、ボタンで次のシーン(シーン2)に行って、テキストにシーン1で入力した文字を出力する。」です。
①シーン間で引き継げるクラスとオブジェクトを用意する。
まずは、以下のクラスを作成。
引き継ぎ用クラス
[DeliverClass.cs]
上記クラスをシーン1に置きます。
●シーン1

受け渡す準備が完了しました。
それでは、シーン1で「ボタンを押したら、インプットフィールドに入力した文字をDeliverクラスに引き渡す」をやってみましょう。
[Scene1.cs]
ボタンを押した時にOnClickButtonが呼ばれるようにしておきましょう。
これで、InputFieldに文字を入力したものが、DeliverClassのdeliverStringに入り、次のシーンに持ち越すことができます。
それでは、シーン2の方のコードも書いてみましょう。
[Scene2.cs]
シーン2の方では、Startの中でDeliverClassから値を持ってきて、Textにセットすることをしています。
実際に実行すると、DeliverのオブジェクトがDontDestroyOnLoadのところにあるのが確認できると思います。

これが「シーンが変わっても消えないオブジェクト」になります。
これで、シーン1のInputFieldの値をシーン2に引き渡すことができます。
ってことで、簡単かつ基本的なことでしたが、誰かの役に立てば幸い・・・・
あでゅ~ノシ
今年もまた多いとか・・・つらい時期が始まりました。坂内っす。
ネタが思いつかないので、初心に戻って「シーンを跨いだデータの渡し方」をやってみましょう。
まずはシーンを2つ用意します。
●シーン1

●シーン2

やることは、「シーン1のインプットフィールドに文字を入力し、ボタンで次のシーン(シーン2)に行って、テキストにシーン1で入力した文字を出力する。」です。
①シーン間で引き継げるクラスとオブジェクトを用意する。
まずは、以下のクラスを作成。
引き継ぎ用クラス
[DeliverClass.cs]
using UnityEngine;
public class DeliverClass : MonoBehaviour
{
public string deliverString;
private void Start() {
DontDestroyOnLoad(this);
}
}
上記クラスをシーン1に置きます。
●シーン1

受け渡す準備が完了しました。
それでは、シーン1で「ボタンを押したら、インプットフィールドに入力した文字をDeliverクラスに引き渡す」をやってみましょう。
[Scene1.cs]
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Scene1 : MonoBehaviour {
public InputField inputField;
public void OnClickButton() {
// DeliverClassを取得
DeliverClass deliver = FindObjectOfType<DeliverClass>();
// InputFieldの文字列をDeliverに渡す
deliver.deliverString = inputField.text;
// シーンを20190304_02に移動
SceneManager.LoadScene("20190304_02");
}
}
ボタンを押した時にOnClickButtonが呼ばれるようにしておきましょう。
これで、InputFieldに文字を入力したものが、DeliverClassのdeliverStringに入り、次のシーンに持ち越すことができます。
それでは、シーン2の方のコードも書いてみましょう。
[Scene2.cs]
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Scene2 : MonoBehaviour
{
public Text txtString;
private void Start() {
// DeliverClassを取得
DeliverClass deliver = FindObjectOfType<DeliverClass>();
// DeliverClassから文字列を取得し、セット
txtString.text = deliver.deliverString;
}
public void OnClickBackButton() {
SceneManager.LoadScene("20190304_01");
}
}
シーン2の方では、Startの中でDeliverClassから値を持ってきて、Textにセットすることをしています。
実際に実行すると、DeliverのオブジェクトがDontDestroyOnLoadのところにあるのが確認できると思います。

これが「シーンが変わっても消えないオブジェクト」になります。
これで、シーン1のInputFieldの値をシーン2に引き渡すことができます。
ってことで、簡単かつ基本的なことでしたが、誰かの役に立てば幸い・・・・
あでゅ~ノシ
【ハルシオンブログ】SoftMaskScriptってやつをちょっと使ってみた。
こんにちは。
大坂です。
急に寒くなってきましたね。
皆様体調にはお気をつけを。
uGUI(TextやImage)を簡単にトランジション的なマスクをするのに使える「SoftMaskScript」ってやつの紹介。
以下のダウンロードページでダウンロードできる
「UnityUIExtensions.unitypackage」の中にある「SoftMaskScript」ってやつですね。
https://bitbucket.org/UnityUIExtensions/unity-ui-extensions/downloads/
他にもいろいろはいっていますが。とりあえず「SoftMaskScript」使ってみました。
使い方は簡単。
TextとかImageにAddComponentして、
AlphaMaskにテクスチャを設定してCutOffの数字をいじるだけですね。


※クリックすると動くよ
ちなみにスクリプトからいじる場合はこんな感じ。

※クリックすると動くよ
なんか簡単なのに使えるかもしれませんね!
ではまたノシ
大坂です。
急に寒くなってきましたね。
皆様体調にはお気をつけを。
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);
}

※クリックすると動くよ
なんか簡単なのに使えるかもしれませんね!
ではまたノシ
【ハルシオンブログ】int → enum の変換とか最近使ったちょっとしたやつ?
こんにちは。
大坂です。
今週も木曜日がやってきました。
そして今週もたいして書くことがありません!
ということで最近コーディングで使ったやつ。
相変わらず誰でも知ってそうなのでごまかしていきます(ぁ
とりあえず int → enum の変換について
今までこんな感じでしかできないと思ってたんですが、
これでもできるんですね。
なんか結構前にやった時にできなかった気がするけど気がしただけだったのか…。
次、ListのInsert…まぁ普通にあるやつですが最近初めて使いました。
Listの指定した場所に挿入するやつですね。
とかってやると、
aaaa, cccc, bbbb
の順番になる。
リストの長さより長いところに挿入しようとするとエラーになります(当たり前?
一応こんな感じでやると、ArgumentOutOfRangeExceptionが出ますね。
ということで今週も終わりです。
また~ノシ
大坂です。
今週も木曜日がやってきました。
そして今週もたいして書くことがありません!
ということで最近コーディングで使ったやつ。
相変わらず誰でも知ってそうなのでごまかしていきます(ぁ
とりあえず 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の指定した場所に挿入するやつですね。
ListblogList = new List ();
blogList.Add("aaaa");
blogList.Add("bbbb");
blogList.Insert(1, "cccc");
とかってやると、
aaaa, cccc, bbbb
の順番になる。
リストの長さより長いところに挿入しようとするとエラーになります(当たり前?
ListblogList = new List ();
blogList.Insert(1, "cccc");
一応こんな感じでやると、ArgumentOutOfRangeExceptionが出ますね。
ということで今週も終わりです。
また~ノシ
【ハルシオンブログ】Androidでバックボタンでアプリを終了させるとき?
こんにちは。
大坂です。
今日から11月ですね!
今年もあと2ヶ月です…orz
さて、今週もタイトル通りですが、Unityでアプリを作ったときのAndroidアプリのバックボタンのお話。
終わらせるだけならこんな書き方ができるよってだけですが。
とりあえず今までやってた方法。
これでバックボタン押すと終了します。
これを1行にできる。
これでもバックボタンを押すとアプリが終了されますね!
簡単にアプリを終わらせたいだけならこれで十分な機能なので紹介でした。
では超絶に短いですが今週もこれにてノシ
大坂です。
今日から11月ですね!
今年もあと2ヶ月です…orz
さて、今週もタイトル通りですが、Unityでアプリを作ったときのAndroidアプリのバックボタンのお話。
終わらせるだけならこんな書き方ができるよってだけですが。
とりあえず今までやってた方法。
void Update () {
if(Input.GetKeyDown(KeyCode.Escape)) {
Application.Quit();
}
}
これでバックボタン押すと終了します。
これを1行にできる。
void Start () {
Input.backButtonLeavesApp = true;
}
これでもバックボタンを押すとアプリが終了されますね!
簡単にアプリを終わらせたいだけならこれで十分な機能なので紹介でした。
では超絶に短いですが今週もこれにてノシ