8月12日に東京ビックサイトで開催される「コミックマーケット104」で、サークルスペースを頂くことができ、 本日無事に新刊の入稿が完了しました。
続きを読む城崎温泉の名物外湯
城崎温泉に行く機会があり、名物の外湯巡りをしました。 天候は雨でしたが、傘をさしながら巡りました。
まんだらの湯
6つの外湯の中で一番小さかったです。 露天風呂を体に2つの瓶型のお風呂があるのが特徴でした。
御所の湯
外流れる滝を見ることができる露天風呂です。 立ち湯があるのが個人的にとても良かったです。建物自体も新しいのかとても綺麗でした。
地蔵湯
宿のあるエリアから一番遠い(駅からは一番近い) 大きさは6つの中では中位。
柳の湯
杉(もしくはひのき)で作られたお風呂で、サイズは小さいですが、木の香りが心地よいです。
一の湯
洞窟の中に露天風呂がある。 ここだけではないですが、露天風呂はぬるいので長く入ることができる。
鴻の湯
こちらも露天風呂があります。 シンプルなお風呂。
最後に
城崎温泉のお湯は基本的に熱めですので、長時間浸かるのが難しいです。ただし、露天風呂は水温が若干低めで、長く楽しむことができます。水の色は透明に近いです。熱いため、一度に多くの湯を巡るのではなく、1~2箇所ずつゆっくりと楽しむのがおすすめです。また、定休日があるため、事前に休みの日を確認することも大切です。
LinqのTakeとSkipについて
Linqで出会った、初見では理解が難しかった関数について、メモ代わりにブログに記載します。
Take
Takeはシーケンスの先頭から指定した数の要素を返します。
int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // Takeメソッドを使用して、最初の3つの要素を取得します。 var firstThreeNumbers = numbers.Take(3); // 出力結果 0 1 2
Skip
Skipはシーケンスの先頭から指定した数の要素をスキップし、その後の要素を返します。
// Skipメソッドを使用して、最初の3つの要素をスキップします。 var numbersAfterFirstThree = numbers.Skip(3); // 出力結果 3 4 5 6 7 8 9
TakeやSkipメソッドは一般的に非常に効率的です。これらは遅延評価を活用しており、必要な要素だけを処理するため、大きなコレクションに対してもパフォーマンスが良好です。
【Unity】Settingに項目を追加する
独自のSettingを追加したい場合のやり方を調べてみました。
サンプルコード
次のコードはProjectSettingに項目を追加する最小限のコードになります。 SettingProviderを継承したクラスを作成し、コンストラクタなどを追加します。
public class AnotherSettingProvider : SettingsProvider { public AnotherSettingProvider(string path, SettingsScope scopes, IEnumerable<string> keywords = null) : base(path, scopes, keywords) { } [SettingsProvider] public static SettingsProvider CreateAnotherSettingsProvider() { var provider = new AnotherSettingProvider("Preferences/Another Setting", SettingsScope.User); return provider; } }
SettingsScope
SettingsScopeはSettingsWindowかPreferencesWindowに項目するかどうかで設定が変わります。 SettingsScope.Userにして、今回はPreferencesWindowに項目を追加しています。
項目の中身を書く
OnGUIに項目の中身を記載します。
public override void OnGUI(string searchContext) { EditorGUILayout.LabelField("This is another setting provider"); }
保存する用のScriptableObjectを用意する
settingの内容を保存するScriptableObjectを用意します。
public class NewProjectSetting : ScriptableObject { public bool hoge = false; }
こちらのScritableObjectを表示するようAnotherSettingProviderを調整します。
private static NewProjectSetting _settings; private SerializedObject _setting; private const string path = "Assets/AnotherSetting.asset"; public override void OnActivate(string searchContext, VisualElement rootElement) { _settings = AssetDatabase.LoadAssetAtPath<NewProjectSetting>(path); if (_settings == null) { var setting = ScriptableObject.CreateInstance<NewProjectSetting>(); AssetDatabase.CreateAsset(setting, path); } _setting = new SerializedObject(_settings); } public override void OnGUI(string searchContext) { if (_settings == null) return; _setting.Update(); EditorGUILayout.PropertyField(_setting.FindProperty("hoge")); _setting.ApplyModifiedProperties(); }
次のように表示されます。
このScripatbleObjectを使って必要な処理を実装できます。
OnActivate
OnActivateメソッドは設定プロバイダがアクティブになる時(つまりユーザが設定ウィンドウを開いた時)に呼び出されます。 そのため、設定ウィンドウが開かれた際に必要なセットアップ、例えば設定のロードやUIの更新などのコードは、OnActivateメソッド内に配置するのが一般的です。
最後に
後は、設定した項目を必要な箇所で利用します。
Unity2023のAwaitableについて調べてみた
Awaitable型は非同期コードを公開するために使用され、Unityに特化した非同期の戻り値型も提供します。
Awaitableについて
UnityのAwaitableは、非同期コードの戻り値として特にUnity環境に適した型を提供します。これにより、非同期操作の完了まで待機するプロセスを表現でき、非同期メソッドの戻り値として利用されます。 例えば、Awaitable.NextFrameAsync(ct)メソッドは次のフレームまでの待機を非同期で実行し、UniTaskを返します。このUniTaskをawaitにより処理することで、非同期的に次のフレームまでの待機が可能です。
private async Awaitable HogeAsync(CancellationToken ct) { Debug.Log(Time.frameCount); await Awaitable.NextFrameAsync(ct); Debug.Log("待機:" + Time.frameCount); } // 出力結果 1 // Start()が呼び出されたときのフレームカウント 待機:2 // 次のフレームでのフレームカウント
同じことをUniTaskでする場合は次のようなコードになります。
await UniTask.Yield();
その他
WaitForSecondsAsyncは指定秒待機します。
private async Awaitable HogeAsync(CancellationToken ct) { Debug.Log(Time.time); await Awaitable.WaitForSecondsAsync(seconds: 1f, cancellationToken: ct); Debug.Log("待機:" + Time.time); }
キャンセル
CancellationTokenがキャンセルされた場合、OperationCanceledExceptionがスローされます。
private async Awaitable HogeAsync(CancellationToken ct) { try { await Awaitable.WaitForSecondsAsync(seconds: 30f, cancellationToken: ct); } catch (OperationCanceledException) { Debug.Log("キャンセルされました"); } }
C#のLazy<T>について調べてみたメモ
Lazy
実装例
簡単な実装例は次のようになります。
private Lazy<string> lazyValue = new Lazy<string>(() => { Debug.Log("Lazy value is being calculated"); return "Hello, World!"; }); void Start() { Debug.Log("first"); Debug.Log(lazyValue.Value); Debug.Log("second"); Debug.Log(lazyValue.Value); Debug.Log("third"); Debug.Log(lazyValue.Value); } // 出力結果 first Lazy value is being calculated Hello, World! second Hello, World! third Hello, World!
このコードは、lazyValueというLazy
注意点
先ほどの例のように、Lazy