【ハルシオンブログ】Unity2021からオブジェクトプールが公式で実装されてるぽいですね。試しに使ってみました。
坂内っす。
めっさ寒くなってきましたね。
ザ・冬って感じになってきました。
風邪に気をつけましょう。
以前オブジェクトプールについて書いたのですが
http://halcyonsystemblog.jp/?q=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%97%E3%83%BC%E3%83%AB&charset=utf-8
Unity2021.1からちゃんとオブジェクトプールの機能があるぽいですね。
なので、それの紹介を簡単にしてみたいと思います。
IObjectPoolを使う感じぽいですね。
[Blog20211129.cs]
なんかちょっとめんどくさいですね。
こんな感じで使えるらしいです。
取り出す時に行う処理、プールに戻す時に行う処理、指定した数以上のオブジェクトをプールに戻す時に行う処理を初めに設定する感じぽいです。
まだまだ謎は多いですが・・・これ自前の方が楽そうではありますよねぇ
ということで、簡単にですが、Unity2021以降から使えるオブジェクトプールの説明でした。
あでゅ~ノシ
めっさ寒くなってきましたね。
ザ・冬って感じになってきました。
風邪に気をつけましょう。
以前オブジェクトプールについて書いたのですが
http://halcyonsystemblog.jp/?q=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%97%E3%83%BC%E3%83%AB&charset=utf-8
Unity2021.1からちゃんとオブジェクトプールの機能があるぽいですね。
なので、それの紹介を簡単にしてみたいと思います。
IObjectPoolを使う感じぽいですね。
[Blog20211129.cs]
using UnityEngine;
using UnityEngine.Pool;
using UnityEngine.UI;
public class Blog20211129 : MonoBehaviour
{
[SerializeField] GameObject objPref;
[SerializeField] Button btnCreate;
int defaultCapacity = 10;
int maxSize = 100;
public IObjectPool<GameObject> _pool;
public IObjectPool<GameObject> pool {
get {
if (_pool == null) {
_pool = new ObjectPool<GameObject>(CreatePoolItem, OnTakeFromPool, OnReturnedToPool, OnDestroyPoolObject, false, defaultCapacity, maxSize);
}
return _pool;
}
}
/// <summary>
/// プールオブジェクト生成
/// </summary>
/// <returns></returns>
GameObject CreatePoolItem() {
var go = Instantiate(objPref, new Vector3(Random.Range(-10f, 10), Random.Range(-10f, 10f), Random.Range(-10f, 10f)), Quaternion.identity);
return go;
}
/// <summary>
/// プールから取得するときに行う処理
/// </summary>
void OnTakeFromPool(GameObject go) {
// 特になし
}
/// <summary>
/// オブジェクトをプールに戻す時に行う処理
/// 「Called when an item is returned to the pool using Release」
/// </summary>
void OnReturnedToPool(GameObject go) {
// 特になし
}
/// <summary>
/// オブジェクトをプールに戻す時に、容量上限に達している場合に行う処理
/// </summary>
/// <param name="go"></param>
void OnDestroyPoolObject(GameObject go) {
Destroy(go);
}
void Start() {
btnCreate.onClick.AddListener(OnClickButton);
}
void OnClickButton() {
int amount = Random.Range(10, 100);
for (int i = 0; i < amount; i++) {
var ps = pool.Get();
}
}
}
なんかちょっとめんどくさいですね。
こんな感じで使えるらしいです。
取り出す時に行う処理、プールに戻す時に行う処理、指定した数以上のオブジェクトをプールに戻す時に行う処理を初めに設定する感じぽいです。
まだまだ謎は多いですが・・・これ自前の方が楽そうではありますよねぇ
ということで、簡単にですが、Unity2021以降から使えるオブジェクトプールの説明でした。
あでゅ~ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】Prefab編集時のオートセーブ機能
こんにちは。
大坂です。
Prefab編集時にデフォルトだと変更をオートセーブするようになっていますが、配置とかをちょっと試したいだけとかの時にオートセーブをしない方法。
「Scene」の「AutoSave」のチェックを外せばオートセーブしなくなります。

Unity2020.2以降の機能でプロジェクトとしてオートセーブしたくないときは、
[Editor]-[ProjectSettings]-[Editor]-[Allow Auto Save]のチェックボックスを外すとSceneのところのチェックボックスが触れなくなってオートセーブがされなくなります。



オートセーブはしませんが、変更したものは「Save」ボタン押すか「Ctrl+S」で保存できます。
基本的にはオートセーブをしてもらった方がいいときの方が多いと思いますが…。
オートセーブしてほしくないときもあるかもしれないので紹介でした。
ではまたノシ
大坂です。
Prefab編集時にデフォルトだと変更をオートセーブするようになっていますが、配置とかをちょっと試したいだけとかの時にオートセーブをしない方法。
「Scene」の「AutoSave」のチェックを外せばオートセーブしなくなります。

Unity2020.2以降の機能でプロジェクトとしてオートセーブしたくないときは、
[Editor]-[ProjectSettings]-[Editor]-[Allow Auto Save]のチェックボックスを外すとSceneのところのチェックボックスが触れなくなってオートセーブがされなくなります。



オートセーブはしませんが、変更したものは「Save」ボタン押すか「Ctrl+S」で保存できます。
基本的にはオートセーブをしてもらった方がいいときの方が多いと思いますが…。
オートセーブしてほしくないときもあるかもしれないので紹介でした。
ではまたノシ
Category: 開発日記(Unity)
【ハルシオンブログ】「●●分後に処理を行う」を簡単にやる方法。
こんにちは。坂内っす。
音楽って難しいですね・・・・・
芸術物って言葉にできない。
どんな曲が欲しいのかを言葉にできない。
この曲は何かが違う。でも何がどう違うかを言葉にできない。
ゲームも同じですよね。
何かが違うけど何が違うのかわからない。
それでも今日もゲームを作り続ける。
さて、Unityで「●●分後になったら▲▲をする」という処理を作るとき、こうやって書いてるけどメモ。
もっといい方法あったら教えてくださいね。
[Blog20211122.cs]
Startで「2分後」をセットし、Updateで1秒おきに2分後になったかのチェックをしています。
2分後になったら、ActionProcメソッドを処理します。
と、こんな感じで●●分後は .AddMinutesで指定できます。
もちろん●秒後(AddSeconds)や、●時間後(AddHours)も設定可能。
まぁただの時間設定なんですけどね・・・・・
他にもInvokeで時間指定する方法もありますね。
ってことで、簡単な「●●分後に処理を行う」についてでした。
では、あでゅ~ノシ
音楽って難しいですね・・・・・
芸術物って言葉にできない。
どんな曲が欲しいのかを言葉にできない。
この曲は何かが違う。でも何がどう違うかを言葉にできない。
ゲームも同じですよね。
何かが違うけど何が違うのかわからない。
それでも今日もゲームを作り続ける。
さて、Unityで「●●分後になったら▲▲をする」という処理を作るとき、こうやって書いてるけどメモ。
もっといい方法あったら教えてくださいね。
[Blog20211122.cs]
using System;
using UnityEngine;
public class Blog20211122 : MonoBehaviour
{
DateTime dtimeProc;
float timer;
bool isAction;
private void Start() {
dtimeProc = DateTime.Now.AddMinutes(2);
}
void ActionProc() {
// 処理
}
private void Update() {
if (isAction) {
return;
}
timer += Time.deltaTime;
if (timer >= 1) {
timer = 0f;
// 1秒毎に判定
if (DateTime.Now >= dtimeProc) {
isAction = true;
ActionProc();
}
}
}
}
Startで「2分後」をセットし、Updateで1秒おきに2分後になったかのチェックをしています。
2分後になったら、ActionProcメソッドを処理します。
と、こんな感じで●●分後は .AddMinutesで指定できます。
もちろん●秒後(AddSeconds)や、●時間後(AddHours)も設定可能。
まぁただの時間設定なんですけどね・・・・・
他にもInvokeで時間指定する方法もありますね。
ってことで、簡単な「●●分後に処理を行う」についてでした。
では、あでゅ~ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】Unity2021.2でC#9の一部機能が使えるようになったようです。
こんにちは。
大坂です。
Unity2021.2からC#9.0の一部機能が使えるようになったみたいですね。
公式のリリースノートから抜粋

- パターンマッチングの機能強化
- 関数ポインタ
- target-typed new
- 静的匿名関数
- target-typed条件演算子
- foreachループの拡張GetEnumeratorサポート
- ラムダ式での引数の破棄
- ローカル関数の属性
- 新しいpartialメソッド
という感じでしょうか。
色々ありますが今回はパターンマッチングの機能強化について少しだけ。
条件文で使えるようになった感じですかね。
上記は変数でやってますが、関数でやっても1回の評価しかされないということですね。
今までは関数の戻り値を1回変数に入れてからやっていたところが省略できる感じになります。
色々組み合わせて複雑なことも出来ますが、やりすぎるとコードが読みにくくなりそうなので、注意が必要そうです。
では今週もこれにてノシ
大坂です。
Unity2021.2からC#9.0の一部機能が使えるようになったみたいですね。
公式のリリースノートから抜粋

- パターンマッチングの機能強化
- 関数ポインタ
- target-typed new
- 静的匿名関数
- target-typed条件演算子
- foreachループの拡張GetEnumeratorサポート
- ラムダ式での引数の破棄
- ローカル関数の属性
- 新しいpartialメソッド
という感じでしょうか。
色々ありますが今回はパターンマッチングの機能強化について少しだけ。
条件文で使えるようになった感じですかね。
int i = 0;
// いままで
if (i >= 0 && i < 10)
}
// パターンマッチングの強化
if (i is >= 0 and < 10) {
}
何が違うかというと、「i」の評価が1回でいいというところです。上記は変数でやってますが、関数でやっても1回の評価しかされないということですね。
今までは関数の戻り値を1回変数に入れてからやっていたところが省略できる感じになります。
// いままで
int i = GetInt();
if(i >= 0 && i < 10){
}
// パターンマッチングの強化
if(GetInt() is >= 0 and < 10) {
}
慣れたら使いやすいんでしょうかね…?色々組み合わせて複雑なことも出来ますが、やりすぎるとコードが読みにくくなりそうなので、注意が必要そうです。
では今週もこれにてノシ
Category: 開発日記(Unity)
【ハルシオンブログ】久しぶりにデジゲー博いってきましたよー
こんにちは。っ坂内です。
11月14日はデジゲーの日でした。
2-3年振りにデジゲーいってきましたよっと。
では例のごとく、写真をはりつけますね。
(毎回知り合いのブースばかりで)
「ノナプルナイン」さんのブース。

毎回ブースがしっかりしとります!
こちらの開発9年しとるらしいですね・・・・すげぇ
そして、こちら。
「触手を売る店」こと、Achamothさんのブース。

独特な世界観がブースにも出てますね。
放置ゲーですね。まだやってない方はどうぞ!
そして次はジラフとアンニカさんのブース

こちらもゲームイベント大御所の紙パレットさん
いつもブースが華やか。
自分でブースだすならこれくらい色々な物出していきたいですよねー
「ことだま日記」さんのブース

こちらも色々なもの売ってますね。
ドットのかわいいキャラがいっぱいいましたよ。
「スカシウマラボ」さんのブース

今話題(?)の和階堂シリーズのブースですねー
渋い。
Switchにも移植したりと頑張ってますよねー
そしてスカシウマラボさんの隣にふりふらさんのブースがありました。

めくるりウィッチというゲームのようです。
他にも数ブースまわったよ。
モン娘ぐらでぃえーたさんのブース、Room6さん、G-modeさん、じぇっどむさん等々。
ただ写真はない。(写真撮り忘れたとか、撮った写真が微妙だったり)
とりあえず皆元気そうでよかったです。
いずれうちもブースとかね・・・・いや・・・ないかなぁ・・・・
ということで、デジゲーいってきたよーという報告でした。
では、あでゅ~ノシ
11月14日はデジゲーの日でした。
2-3年振りにデジゲーいってきましたよっと。
では例のごとく、写真をはりつけますね。
(毎回知り合いのブースばかりで)
「ノナプルナイン」さんのブース。

毎回ブースがしっかりしとります!
こちらの開発9年しとるらしいですね・・・・すげぇ
そして、こちら。
「触手を売る店」こと、Achamothさんのブース。

独特な世界観がブースにも出てますね。
放置ゲーですね。まだやってない方はどうぞ!
そして次はジラフとアンニカさんのブース

こちらもゲームイベント大御所の紙パレットさん
いつもブースが華やか。
自分でブースだすならこれくらい色々な物出していきたいですよねー
「ことだま日記」さんのブース

こちらも色々なもの売ってますね。
ドットのかわいいキャラがいっぱいいましたよ。
「スカシウマラボ」さんのブース

今話題(?)の和階堂シリーズのブースですねー
渋い。
Switchにも移植したりと頑張ってますよねー
そしてスカシウマラボさんの隣にふりふらさんのブースがありました。

めくるりウィッチというゲームのようです。
他にも数ブースまわったよ。
モン娘ぐらでぃえーたさんのブース、Room6さん、G-modeさん、じぇっどむさん等々。
ただ写真はない。(写真撮り忘れたとか、撮った写真が微妙だったり)
とりあえず皆元気そうでよかったです。
いずれうちもブースとかね・・・・いや・・・ないかなぁ・・・・
ということで、デジゲーいってきたよーという報告でした。
では、あでゅ~ノシ
Category: その他日記
【ハルシオンブログ】stringからenumへの変換2 大文字小文字の吸収
こんにちは。
大坂です。
以前、stringからenumへの変換の記事を書きましたが、大文字小文字の吸収をしたいなぁと思ったら簡単だったのでご紹介。
「Enum.Parse」も「Enum.TryParse」も第二引数に「True」を渡せばやってくれますね。
Enum.Parse

Enum.TryParse

簡単にですがこんな感じです。
渡してる文字列の先頭が小文字でもちゃんと変換してくれてますね。

必要な場面は少ないと思いますが、一時的に必要だったので使ってみたついでにご紹介でした。
ではまたノシ
大坂です。
以前、stringからenumへの変換の記事を書きましたが、大文字小文字の吸収をしたいなぁと思ったら簡単だったのでご紹介。
「Enum.Parse」も「Enum.TryParse」も第二引数に「True」を渡せばやってくれますね。
Enum.Parse

Enum.TryParse

簡単にですがこんな感じです。
enum TestEnum {
Test_1,
Test_2,
Test_3,
Test_4,
}
public void Start() {
// Enum.Parse
Debug.Log((TestEnum)Enum.Parse(typeof(TestEnum), "test_1", true));
// Enum.TryParse
Enum.TryParse("test_4", true, out TestEnum testEnum_4);
Debug.Log(testEnum_4);
}
渡してる文字列の先頭が小文字でもちゃんと変換してくれてますね。

必要な場面は少ないと思いますが、一時的に必要だったので使ってみたついでにご紹介でした。
ではまたノシ
Category: 開発日記(Unity)
【ハルシオンブログ】Unityでトグルボタン的なものの作り方。私はこうやってつくってますの紹介です。
こんにちは。
今週末はデジゲーですね。
ちょっくら遊びに行ってきます。
ブース開いてるみなさん頑張ってくださいませ!
ちょこっとだけ写真撮ってきますね!
さて、こんな感じのトグルボタン(押すとボタンが切り替わるやつ)とかってUnityでどうやって作ってますか?

私はこんな感じで作ってますよっていう簡単な紹介をば。
まずはボタンの画像を2つほど用意します。

次のコードを作成。
[Blog20211108.cs]
で、sprOnOffに先ほど作った画像をアサインします。

もちろんボタンもアサインしてね。
私はこんな感じで作ってます。
もちろんボタンの絵をResourceから持ってくる場合はこんな感じになります。
こんな感じ。
ということで、トグルボタンの簡単なつくり方でした。
では、あでゅ~ノシ
今週末はデジゲーですね。
ちょっくら遊びに行ってきます。
ブース開いてるみなさん頑張ってくださいませ!
ちょこっとだけ写真撮ってきますね!
さて、こんな感じのトグルボタン(押すとボタンが切り替わるやつ)とかってUnityでどうやって作ってますか?

私はこんな感じで作ってますよっていう簡単な紹介をば。
まずはボタンの画像を2つほど用意します。

次のコードを作成。
[Blog20211108.cs]
using UnityEngine;
using UnityEngine.UI;
public class Blog20211108 : MonoBehaviour {
[SerializeField] Button btnOnOff;
[SerializeField] Sprite[] sprOnOff;
bool isBtnOn;
private void Start() {
btnOnOff.onClick.AddListener(OnClickButton);
}
void OnClickButton() {
isBtnOn = !isBtnOn;
if (isBtnOn) {
btnOnOff.gameObject.GetComponent<Image>().sprite = sprOnOff[1];
// ONになったときの処理
} else {
btnOnOff.gameObject.GetComponent<Image>().sprite = sprOnOff[0];
// OFFになったときの処理
}
}
}
で、sprOnOffに先ほど作った画像をアサインします。

もちろんボタンもアサインしてね。
私はこんな感じで作ってます。
もちろんボタンの絵をResourceから持ってくる場合はこんな感じになります。
void OnClickButton() {
isBtnOn = !isBtnOn;
if (isBtnOn) {
btnOnOff.gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>("ONのファイル");
// ONになったときの処理
} else {
btnOnOff.gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>("OFFのファイル");
// OFFになったときの処理
}
}
こんな感じ。
ということで、トグルボタンの簡単なつくり方でした。
では、あでゅ~ノシ
Category: 開発日記(Unity)
「The same field name is serialized multiple times in the class or its parent class.」がなんか出た時
こんにちは。
大坂です。
なんかUnityで急に「The same field name is serialized multiple times in the class or its parent class.」なんてエラーが出た。
何のエラーかというと「継承元と継承先のクラスの同名Private変数をSerializeできない」ということらしいです。
クラスの整理して子クラスで宣言しなくてもよくなった変数をprotectedからprivateにして一部クラスで変数を消し忘れたのが原因でした。
変更後すぐに出なくてしばらくしてからエラーが出たのが謎なんですが…。
まぁ・・・こんなことをしてたらエラーが出るようになります。
両クラスで宣言したい場合は親クラスの変数をprotectedにするか、子クラスの変数名を変えるかしましょう。
エラーを見て子クラスで必要なければ変数を消しましょう。
では今週もこれにてノシ
大坂です。
なんかUnityで急に「The same field name is serialized multiple times in the class or its parent class.」なんてエラーが出た。
何のエラーかというと「継承元と継承先のクラスの同名Private変数をSerializeできない」ということらしいです。
クラスの整理して子クラスで宣言しなくてもよくなった変数をprotectedからprivateにして一部クラスで変数を消し忘れたのが原因でした。
変更後すぐに出なくてしばらくしてからエラーが出たのが謎なんですが…。
まぁ・・・こんなことをしてたらエラーが出るようになります。
public class Test : MonoBehaviour
{
[SerializeField]
private string message;
}
public class Test_1 : Test
{
[SerializeField]
private string message;
}
両クラスで宣言したい場合は親クラスの変数をprotectedにするか、子クラスの変数名を変えるかしましょう。
エラーを見て子クラスで必要なければ変数を消しましょう。
では今週もこれにてノシ
Category: 開発日記(Unity)
【ハルシオンブログ】AddressableAssetsに同期ロードが追加されていたんですね!より使いやすくなったのでは!?
11月になってしまいました。
あと2か月で今年も終わりですね・・・・つらい
ポケガ3の開発状況ですが、50%くらいですかね。
わかりません。
坂内です。
UnityのAddressableAssetsがいつの間にか更新されていました。
以前(1.1.3くらい?)までは非同期でしかデータを持ってこれなかったのに、今の最新(1.19.9)では同期でのデータの取得ができるようになってます。
調べてみると、1.17.4からできるようになったぽいですね。
非同期でのデータロード
こんな感じでやってました。
同期でのデータロード
最新ではこんな感じでSpriteをロードして返すことができます。
これは画期的!
ってかちょー簡単に使えるようになりました。
ポケガ3作り始めたときのAddressableとはだいぶバージョンも上げってるようですし、使いやすくなってますね。
ではこんなもので、今日はおしまいです。 あでゅ~ノシ
あと2か月で今年も終わりですね・・・・つらい
ポケガ3の開発状況ですが、50%くらいですかね。
わかりません。
坂内です。
UnityのAddressableAssetsがいつの間にか更新されていました。
以前(1.1.3くらい?)までは非同期でしかデータを持ってこれなかったのに、今の最新(1.19.9)では同期でのデータの取得ができるようになってます。
調べてみると、1.17.4からできるようになったぽいですね。
非同期でのデータロード
public IEnumerator SetAddressableToImage(Image img, string fileName) {
var coroutine = ReadSpriteData(spritePath[(int)type] + fileName + ".png");
yield return StartCoroutine(coroutine);
img.sprite = (Sprite)coroutine.Current;
yield return null;
}
こんな感じでやってました。
同期でのデータロード
public Sprite GetSpriteFromAddressable(string fileName) {
var op = Addressables.LoadAssetAsync<Sprite>(fileName + ".png");
var prefab = op.WaitForCompletion();
Addressables.Release(op);
return prefab;
}
最新ではこんな感じでSpriteをロードして返すことができます。
これは画期的!
ってかちょー簡単に使えるようになりました。
ポケガ3作り始めたときのAddressableとはだいぶバージョンも上げってるようですし、使いやすくなってますね。
ではこんなもので、今日はおしまいです。 あでゅ~ノシ
Category: 開発日記(Unity)
| h o m e |