20211025のUnityに関する記事は3件です。

Unityでgoogle-signin-unityとFirebase SDKを共存させてAndroidビルドする方法のメモ

はじめに 前回 Firebase AuthのGoogle認証をする方法 の記事を書きましたが、記事中の状態でFirebaseFirestoreをインポートしたところエラーが出たので、少し回りくどいですがその対処法を備忘録も兼ねてまとめます。 使用するツール Unity 2021.1.26f1 google-signin-plugin-1.0.4 (google-signin-unity) firebase_unity_sdk_8.4.0 google-signin-unityのインポート 前回 と同様にインポートします。エラーが出る場合は GitHub を参照してください。 Firebase SDKのインポート google-signin-unityをインポートしたプロジェクトとは別で新規のUnityプロジェクトを作成し、必要なSDKをインポートします。前回 の手順 3. 4. と同様にファイルの操作を行います。 flysakiさんの記事 の通りに設定を変更します。External Dependency Manager から Android Resolver と Version Handler を実行し、Androidビルドが成功したら完了です。 google-signin-unityとFirebaseを統合 両者どちらも Assets/ 内にある ExternalDependencyManager を削除します。それぞれバージョンが異なるため、2つを統合した状態で Resolver を実行すると Plugins/Android/ 内のファイルが壊れます。 その後、両者のプロジェクトの Assets/ 内を統合します。Parse/ は Firebase の方を優先してください。 おわりに この状態でビルドしても、Firebase.Editor云々のエラーが出てビルドに失敗する場合があります。Unity Editorを開きっぱなしで何度かビルドを繰り返すと成功することがあります。 もしこれよりもいい方法があれば教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity アニメーション実装時によく参考にしているサイト

はじめに よく参考にするサイトの紹介記事です。 UnityでDOTweenを使用して以下のコードを書いたとします。 transform.DOMoveX(1f, 1f).SetEase(Ease.Linear); イージングでアニメーション具合を調整したいと思った時に以下の問題があります ・どれを設定して良いか直感的にわからない ・一つずつ確認していたら骨が折れてしまう そのとき私がよく利用するのが以下のサイトです。 easing.net グラフでイージングの意味がわかることに加えて、マウスをかざすとアニメーションが再生されるため直感的にイージングを選ぶことができます。 また、グラフを選択すると以下の詳細を見ることができます。 Web関連のサンプルが多いですが、私は時々一番下のMath functionを確認することがあります。 実際の使用例を挙げるとすると、 SEが重複して再生される時の対策として、重なっている音が多いほど音量を再生時に減衰させる実装をするときにこちらのサイトを使用してイージング関数を選択しました。 (こちらに関してはまた別記事で書きたいと思います) 最後に イージンググラフを確認できるサイトは他にも色々あると思いますが、私のお気に入りのサイトを紹介させていただきました。 ぜひ、アニメーション実装の時にご活用ください!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity]ローカライズ拡張例

com.unity.localization Unity にて Localization というローカライズ用のパッケージがリリースされています。インストールは Package Manager → Add package by name... → com.unity.localization と入力 (Unity 2019.4 以降を推奨)。(公式ドキュメント) なお依存している Addressables パッケージもインストールされます。すでにこれを使用しているプロジェクトの場合はバージョン更新が必要になるかもしれません。 導入手順等々は省略し、本稿ではこのパッケージで可能なカスタムフォーマットの例を紹介します。 ローカル変数 まず準備として、今回のすべての例に使う、変数を導入します。グローバル変数とローカル変数の2種類が利用でき、今回はローカル変数で値を渡します。 通常の手順に従いテキストオブジェクトをローカライズ対応させると Localize String Event というコンポーネントが追加されるので、そこの Local Variables に値を追加します。 次にローカライズのエントリーを追加したら、 Smart チェックを入れます。 これで文字列は解釈されるようになり、 {変数名} で値に置き換えられます。 組み込まれている関数例 組み込まれてる関数でローカル変数を使用してみます。 英語に {num:plural:an apple|{} apples} と入力しておくと、ローカル変数を num としてゲーム上では numが1 : an apple numが2 : 2 apples と表示され、厄介な複数形の問題を解決できます。 この plural という部分をカスタムで用意してみよう、というのがいうのが本稿の趣旨です。 カスタム関数の定義手順 1) C#で記述 2) それを登録 C#に加えて登録が必要なので、先に解説しておきます。カスタム関数を定義したら Project Settings から以下のように登録します。 この例では Fahrenheit Formatter という自作のフォーマッターを指定しています。以下の例すべてでこの登録が必要なので、忘れないようにしましょう。 実装例 摂氏華氏変換 まずはわかりやすい例。実際にゲームで使用される例は少ないように感じますが。 FahrenheitFormatter.cs using System; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.SmartFormat.Core.Extensions; using UnityEngine.Assertions; [Serializable] [DisplayName("Fahrenheit Formatter")] public class FahrenheitFormatter : FormatterBase { public override string[] DefaultNames => new string[] { "fahrenheit" }; public override bool TryEvaluateFormat(IFormattingInfo formattingInfo) { if (formattingInfo.CurrentValue is float celsius) { var f = celsius * 9f / 5f + 32f; var str = f.ToString(formattingInfo.FormatterOptions); formattingInfo.Write($"{str}"); return true; } else Assert.IsTrue(false); // make sure the value is float. return false; } } 翻訳例: 実行結果: 英語: 日本語 マイル速度変換 自動車のメーターで速度に mph 表記をする例は多いので、現実世界のレースゲームを作るのであれば必須でしょう。 MphFormatter.cs using System; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.SmartFormat.Core.Extensions; using UnityEngine.Assertions; [Serializable] [DisplayName("MPH Formatter")] public class MPHFormatter : FormatterBase { public override string[] DefaultNames => new string[] { "mph" }; public override bool TryEvaluateFormat(IFormattingInfo formattingInfo) { if (formattingInfo.CurrentValue is float kph) { var mph = kph * 0.621371f; var str = mph.ToString(formattingInfo.FormatterOptions); formattingInfo.Write($"{str}"); return true; } else Assert.IsTrue(false); // make sure the value is float. return false; } } 翻訳例: 実行結果: 英語: 日本語: 順位表示 1st, 2nd, 3rd, 4th ときて 11th, 12th, 13th となり 21st, 22nd, 23rd という、とても厄介な英語の問題。 人数の多いランキングを表示するときは対応が必要になります。 OrdinalFormatter.cs using System; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.SmartFormat.Core.Extensions; using UnityEngine.Assertions; [Serializable] [DisplayName("Ordinal Formatter")] public class OrdinalFormatter : FormatterBase { public override string[] DefaultNames => new string[] { "ordinal" }; public override bool TryEvaluateFormat(IFormattingInfo formattingInfo) { if (formattingInfo.CurrentValue is int num) { var absnum = Mathf.Abs(num); var j = absnum % 10; var k = absnum % 100; if (j == 1 && k != 11) { formattingInfo.Write($"{num}st"); return true; } if (j == 2 && k != 12) { formattingInfo.Write($"{num}nd"); return true; } if (j == 3 && k != 13) { formattingInfo.Write($"{num}rd"); return true; } formattingInfo.Write($"{num}th"); return true; } else Assert.IsTrue(false); // make sure the value is int. return false; } } 翻訳例: 実行結果: 英語: 日本語: 漢数字 日本語に特化して頑張りたいケース。 KansuujiFormatter.cs using System; using System.Text; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.SmartFormat.Core.Extensions; using UnityEngine.Assertions; [Serializable] [DisplayName("Kansuuji Formatter")] public class KansuujiFormatter : FormatterBase { static readonly string[] Digit = { "", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; static readonly string[] SubUnit = { "", "十", "百", "千" }; static readonly string[] Unit = { "", "万", "億" }; public override string[] DefaultNames => new string[] { "kansuuji" }; StringBuilder _stringBuilder = new StringBuilder("", 128); void get4digits(int num, StringBuilder sb) { for (var i = 0; i < 4; ++i) { int r = num % 10; if (r > 0) sb.Insert(0, SubUnit[i]); if (r != 1 || i == 0) sb.Insert(0, Digit[r]); num /= 10; } } public override bool TryEvaluateFormat(IFormattingInfo formattingInfo) { if (formattingInfo.CurrentValue is int num) { if (num == 0) { formattingInfo.Write("零"); return true; } _stringBuilder.Clear(); var n = Mathf.Abs(num); for (var unit = 0; n > 0; n /= 10000) { var dig4 = n % 10000; if (dig4 > 0) { _stringBuilder.Insert(0, Unit[unit]); get4digits(dig4, _stringBuilder); } ++unit; } if (num < 0) _stringBuilder.Insert(0, "マイナス"); formattingInfo.Write(_stringBuilder.ToString()); return true; } else Assert.IsTrue(false); // make sure the value is int. return false; } } 翻訳例: 実行結果: 英語: 日本語: 英語でカンマ区切りで表記されていますが、これは {chapter:#,0}. のように指定しているためです。通常の変数展開にはカスタム関数を記述しなくても、 C# の StringFormat のフォーマットが使用できます。 おまけ:ローカル変数の更新サンプル ローカル変数をランタイムで更新する場合のサンプルを載せておきます。おなじゲームオブジェクトに追加し、ローカル変数名を指定すれば毎フレーム値が増加します。 LocalVariableUpdater.cs using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.Components; using UnityEngine.Localization.SmartFormat.PersistentVariables; using UnityEngine.Assertions; public class LocalVariableUpdater : MonoBehaviour { public string LocalVariableName; FloatVariable _floatVariable; void Start() { var localizeStringEvent = GetComponent<LocalizeStringEvent>(); var localizedString = localizeStringEvent.StringReference; _floatVariable = localizedString[LocalVariableName] as FloatVariable; Assert.IsNotNull(_floatVariable); } void Update() { _floatVariable.Value++; } } まとめ そもそも単位変換は式さえあればいかようにも実装できますが、翻訳者が適切な単位を選択できるようにするところにローカライズでこれを行うメリットがあるでしょう。適切な表記というのは母国語の人間でないとわからないので、翻訳者に選択を委譲することでローカライズの品質を向上することができますね。めでたしめでたし。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む