20210512のUnityに関する記事は5件です。

LeapMotion使った指のanimをbvhにした

UnityからBlenderにモーション持っていきたいんだけど この一言から検証が始まった。 なんとなくできそうなことだけがわかっていたので、安請負をしたところ結構ハマったのでメモとして残しておく。 使用したもの LeapMotion Unity 2019.3 LeapMotionUnityDevKit(こんな名前かはしらない) uniVRM(0.55以上がよさそう?) FinalIK EasyMotionRecorder BVH Tools 適当なVRMのモデル 使用しなかったもの uOSC EVMC4U FBX Exporter ほぼこの記事を参考に書かせていただいております。 https://note.com/361yohen/n/na74a81db00f4 苦戦したこと uniVRMのバージョン0.46を使っていたことで、FinalIKのFull Body Biped IKが半分ぐらいしか見えない状態だった FBXにするつもりでFBXExporter使っていたんだけど、コマみたいにしか動かなかった BVH Toolsの使い方が全く不明 手順 LeapMotionのセットアップ なんか、前はあったかわかんないけど、SDKなどを取得するのにアカウント登録が必要なのでする。 https://developer.leapmotion.com/unity#116 これから、coreを使うのでダウンロードしておく。 unitypackageの中に入っている、 これをヒエラルキーに置く。 leapmotionがつながっていると、再生ボタンを押すとなんか動く。 RigRoundHand_L及びRigRoundHand_Lにいかのような空のケームオブジェクトをつけておく このとき動きが鈍いようだったら、leapmotionが汚れてないかを確認。 UniVRMを読み込みついでにVRMを読み込む 割愛 FinalIK(課金要素)をインポート LeftArmの三角を押すと、LeftHandEffectorというものが出てくるので、Targetにさっきの殻のオブジェクト(例ではHandL1)を指定 これで位置合わせをすると、leapmotionの手首に追従してくねくねと動くようになる。 指の設定 指が動いてほしい気持ちがあるので、配置したVRMモデルに小細工する。 手首と思われる骨に、Rigged Fingerをアタッチ、指の第1関節を設定。 そのあと、LeapMotionのサンプルの中に入ってる、RigidRoundHand_RのRigedHandの値を更新。 指は一本一本丁寧にやる。 これでたぶんLeapMotionでVRMのモデルが動くはず。 モーションデータの収録 EasyMotionRecorderをヒエラルキーにおいて、Animatorを設定。 VRM指定するだけでいい。 再生ボタン押したあと、Rでデータ保存開始、Xで終了。 よくUnityの再生ボタンを切り忘れるので注意。 Resourcesのなかに保存されたものが溜まっていく。 空白の立方体みたいなアイコンみたいなものをインスペクタで変換する これで.animデータができる。 animデータをbvhに変換する アニメーターコントローラー作って、animを設定。 モデルをもう一体立てて、アニメを埋め込む。 BVHTools内の、BVHRecorderというものを空のゲームオブジェクトにアタッチする。 MotionTargetを設定。 保存先のディレクトリ(存在しているもの)と、使っていない名前をつける。(上から2つのDirectoryとFileName) 再生ボタン押したあと、Save Motion to BVH を押す。 再生ボタンをもう一度押して画面を止めると、指定したディレクトリにBVHファイルができている。 めでたしめでたし。 Blenderなどで読み込めるので活用ください。 疲れたー。。。 もっといいほうほうあれば教えて下さい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] ユニティちゃんSunnySideUp(URP版)付属のシェーダーをUnity2020.2以上で動かす

問題 ユニティちゃんSunnySideUp(URP版)をUnity2020.3.6f1で動かしてみようとしたところ、正常に表示されません。 コンソールを見ると、 Shader error in 'Universal Render Pipeline/Toon': 'InitializeStandardLitSurfaceDataUTS': output parameter 'outSurfaceData' not completely initialized at /Users/hogehoge/Documents/Unity/UnityChanSSU_URP/Packages/UnityChanToonShaderVer2_Project-release-urp-2.2/Runtime/Shaders/UniversalToonBody.hlsl(199) (on d3d11) なるエラーが出ています。 調べてみると、どうやらUnity2020.2からURPの新機能が追加され、その影響で動かなくなっている模様。 エラーメッセージを読むと、outSuffaceDataがUniversalToonBody.hlslの inline void InitializeStandardLitSurfaceDataUTS(float2 uv, out SurfaceData outSurfaceData) で完全に初期化されていないようです。 SurfaceDataについて調べてみると、下記のような構造になっています。 https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl struct SurfaceData { half3 albedo; half3 specular; half metallic; half smoothness; half3 normalTS; half3 emission; half occlusion; half alpha; half clearCoatMask; half clearCoatSmoothness; }; InitializeStandardLitSurfaceDataUTS()のコードを見ると、clearCoatMask、clearCoatSmoothnessに値がセットされていません。 解決方法 とりあえず、下記のコードをInitializeStandardLitSurfaceDataUTS()の最後に追加することで、正常に表示されるようになりました。 outSurfaceData.clearCoatMask = 0.0h; outSurfaceData.clearCoatSmoothness = 0.0h; 補足 UnityChanToonShaderVer2_Projectは下記でリリースが続けられており、こちらで最新のUnityへの対応がされているようです。 https://github.com/unity3d-jp/UnityChanToonShaderVer2_Project/releases こちらでは下記のコードをInitializeStandardLitSurfaceDataUTS()の先頭に追加する形で修正されていました。 outSurfaceData = (SurfaceData)0; この記事はユニティちゃんライセンス条項の元に提供されています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】Unity HubからUnityをインストールしようとするとエラーで止まる現象の解決法

現象 Unity HubからUnityをインストールするときに不完全または破損したダウンロードファイルと表示され」、インストールに失敗する現象が起こりました。 既に別バージョンのUnityはインストールしてあり、それらのインストールの時には何もエラーが起きず、解決に困ったので、メモ程度にはなりますが残しておきます。 筆者の環境 MacBookPro2020(Intel版) MacOS Catalina 10.15,7 UnityHub 2.4.3 Unity 2019.4.21f1 及び 2019.4.0f1 インストール済 解決法 結果的に、Mac側の設定を変更してハードディスクをスリープさせないようにしたら解決できました。(しょうもない結果ですみません) 解決までの流れ まず検索して出てきたこちらの記事内容を見て、解決できないのではと思いつつ色々試しました。 まず、デバイス及びソフトの再起動。 次に、使用しているセキュリティソフトのESETでUnity Hubを検査対象から除外しました。 しかしどちらも解決せず。 よく考えるとインストールの進捗のためにMacを触った時に失敗していることが多いように思い、Mac側の設定を見直すことにしました。 システム環境設定→省エネルギーから、赤丸の部分を変更しました。 すると無事インストールに成功しました。 おそらく「可能な限りはハードディスクをスリープさせる」の方だけで良いと思いますが、一応両方実行して直したので両方記載しておきます。 参考文献
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity+PlayFabでGoogle認証でのログイン

はじめに PlayFabのGoogle認証ログインについて(https://docs.microsoft.com/ja-jp/gaming/playfab/features/authentication/platform-specific-authentication/google-sign-in-unity )現在(202105)と仕様が変わりすぎていて落とし穴にハマったので備忘録的な形で作ることに 実際にログインを試行した環境 Unity 2019.4.21f1 play-games-plugin-for-unity v10.12 Android実機 用意する物 ・Unityプロジェクト(Androidビルドができるようにしておく) ・PlayFabを一通り扱えるような環境 (こちらが導入しやすかったので紹介しておきます https://kan-kikuchi.hatenablog.com/entry/PlayFabLogin ) ・GooglePlayゲームSDK (https://github.com/playgameservices/play-games-plugin-for-unity ) ・Google開発者アカウントの作成(若干の初期費用がかかります) ・GoogleログインをするためのAndroid環境(実機がベスト) 実際に行った手順 GooglePlayゲームSDKのユニティパッケージをインポートする。 これはGooglePlayGamesPlugin-0.10.12.unitypackageをそのまま流れるように全部ImportでOK インポートが終わると、Unityエディタに下記のメニューが追加される。 ビルド設定をAndroidにしないと恐らくメニューが有効かされないので注意! Enable Android Auto-resolution?はEnableを選択 前述のAndroid setupが開けるようになったらこの項目は完了 APKファイルの作成 アップロード用のAPK(Android実行ファイル)を作成する。 作成するためにプレイヤー設定を変更していく。 Android⇒その他の設定を開いてパッケージ名の項目を探す。 このパッケージ名が環境構築中しょっちゅう~~.~~.~~の書式から変わってしまっていることもあるので注意しておく。 また、このパッケージ名は各所で使用する為すぐ見れるようにしておくと良い。命名規則等についてはこのあたりを参照してほしい。( http://jumbuck.cocolog-nifty.com/blog/2011/07/android-6c2b.html ) スクリプティングバックエンドをIL2CPPに変更しておく これをしないとARM64出力ができない ARM64にチェックを入れる これをしないと64bit系に対応してないよとGooglePlayConsoleでエラーが吐かれる 暗号化用のカギの作成をする 公開設定タブ⇒キーストアマネージャーを開く 鍵を自分で管理しやすい場所に作成し、パスワードを設定する。 Aliasには鍵の名前を設定する この時のパスワードをしっかり記憶しておかないと、アプリが今後GooglePlayConsole上から変更できなくなる可能性もあるそうなのでしっかり管理しておく。 カギが設定できると下記のように鍵のファイルと今どの名前のカギを使っているかが表示されるようになる。 Unityを立ち上げる度にパスワードは空になるので、ビルドできなかったら大体ここを入力しなおさなければならない。 ここまでできたら一度ビルドをする ビルドをするとエラーがなければAPKファイルが出力されるはず 途中下記のGooglePlaySDKの設定がされてないよというポップアップが出るが、ひとまず最初は無視して良い。 GooglePlayConsoleでアプリを作成する Google開発者アカウントでGooglePlayConsoleにサインインすると下記のような画面が出るので、まずは右上のアプリを作成 アプリ名入力項目は適当で良いが、Googleサインイン用のプロジェクトだからといってアプリ名にGoogleを入れるとアプリ作成ができないので注意。 ここからが自分が引っかかったポイントになるが、内部テスト⇒新しいリリースを作成ボタンでテスト用に作らなければならない。そうしなかった場合、アプリが恐らく製品版リリースした状態でないと接続確認ができないという落とし穴にはまってしまう。 作成したら署名しないとリリースできませんよ。ということで次へボタンを押す。 押した後、内部リリースが下記画像のようにアクティブになり、作成できるようになるはず。 アップロードしてエラーが出ないかどうかを確認する。エラーが出たらエラー内容に言われたとおりに対応をする。 リリース名とかリリースノートはテストならとりあえず適当で問題なし。リソースのレビューができなければ一旦保存ボタンを押す。 保存ボタン押下後、リリースのレビューボタンが押せるようになるはずなので、それを押す。 この時点でもエラーが出る可能性があるのでそれは対応するが、警告は一旦無視しても問題ない。 内部テストとしての公開を開始ボタンでテストバージョンを作成する。 下記のような状態になっていればOK GooglePlayGameサービスAPIの設定 GooglePlayConsole内のPlayゲームサービス⇒設定と管理⇒設定⇒いいえ、ゲームでGoogleAPIを使用していません。を選択し、ゲーム名を入力して画面右下作成ボタンを押す。 Playゲームサービスの設定画面になるはずなので、 OAuth同意画面を設定を押す そうするとGoogleCloudPlatformに行くように指示されるのでリンクへ飛ぶ GoogleCloudPlatform(APIとサービス)の設定 OAuth同意画面では外部のラジオボタンにチェックを入れる。後で、テストユーザーを追加することによりテストが実行できるようになる。 チェックを入れたら作成する。 次にアプリ情報の入力画面になるので、入力必須の項目を入力して次へ進めていく。 進めていくとテストユーザーの登録画面になるので、テストユーザーに追加したいGoogleアカウントのメールアドレスを入力して登録しておく。これをしておかないとサインインのテストができないので注意。 次に認証情報の作成を行う。 Androidを選択してパッケージ名はUnityのプロジェクト設定に記入したものと同じものを入れる。 証明書(フィンガープリント)はGooglePlayConsole内にある 設定⇒アプリの完全性⇒アプリ署名鍵の証明書⇒SHA1 フィンガープリントの内容をコピペ。終わったら作成ボタンでAndroidクライアントを作成完了。 次にAndroidアプリケーションの作成と同じ手順でウェブアプリケーションの作成を選択する。 承認済みのJavaScript生成元のURIを追加ボタンを押して 自分のPlayFabタイトルのAPIエンドポイントを入力する。 PlayFabタイトルのエンドポイントの取得の仕方はタイトルへ入る⇒設定アイコン⇒タイトルの設定⇒API機能タブ⇒APIエンドポイントにある。これはタイトル毎に違うのでそのまま入力しないように注意!また末尾の/は消しておく。 承認済みリダイレクトURIは決まったURL(https://oauth.playfab.com/oauth2/google )を入力して作成ボタンを押す。 作成すると下記画面が出て、クライアントIDとシークレットが出るので、控えておく。 また、このIDとシークレットは認証情報から該当のクライアントIDをクリックすれば見ることもできる。 PlayFabのタイトルにGoogleを連携する PlayFabタイトルの左側メニューからアドオンを選択 Googleを選択 Googleをインストールを選択 インストールには各項目が必要 ここで必要になるライセンスキーはGooglePlayConsole内の収益化のセットアップのライセンスを参照する 全て入力ができたらGoogleをインストールボタンで完了。 GooglePlayConsoleに認証情報を追加する Playゲームサービスの設定から認証情報を追加を選択する。 ゲームサーバーを選択し、名前を適当につける。 認証クライアントに候補が出ない場合は下記のOAuthクライアントを更新をクリックする。 選択することができたら変更を保存する。 上記手順と同じ手順でAndroidの認証情報も追加しておく。 直接はクライアント内では使っていないがこれをやっていないとストアからテストアプリを落とせないので注意。 テスターの追加 こちらはGooglePlayConsole側の内部リリースに対するテスターの追加をする。 テスト⇒内部テスト⇒テスター数⇒メーリングリストを作ってその中にテスト用のGoogleアカウントのメールアドレスを入力し、選択する。 テストへの参加という項目があるのでリンクをコピーし、該当の端末でリンクを入力する。(まだこの時点ではアプリダウンロードページへは飛べない) また、変更がおわったら最後に変更を保存ボタンを押しておく。 Unity側でのGoogleサインイン処理 Googleサインインを実行する為のボタンと、サインイン状態を表示するテキストを用意。 サインイン用のスクリプトを作り、クリックした時のイベントにSignInメソッド(とりあえず今は空)が実行されるようにしておく。 この時点でPlayFabのセッティングは終了させておくこと。 GoogleSignIn.csの中身は大体こんなかんじ。 Textは作ったテキストオブジェクトと紐づけておく。 [SerializeField] Text testText; void Start(){ // GooglePlayの初期化 PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder() .AddOauthScope("profile") .RequestServerAuthCode(false) .Build(); PlayGamesPlatform.InitializeInstance(config); PlayGamesPlatform.DebugLogEnabled = true; PlayGamesPlatform.Activate(); } public void SignIn(){ // サインイン Social.localUser.Authenticate((bool success) => { if (success) { testText.text = "GoogleSignInState:Success"; PlayFabClientAPI.LoginWithGoogleAccount(new LoginWithGoogleAccountRequest() { TitleId = PlayFabSettings.TitleId, ServerAuthCode = PlayGamesPlatform.Instance.GetServerAuthCode(), CreateAccount = true }, (result) => { // PlayFabLoginに成功した内容を書く }, (result) => { // PlayFabLoginに失敗した内容を書く }); } else { testText.text = "GoogleSignInState:Failed"; } }); } GooglePlayGames環境設定 GooglePlayGames⇒Setup⇒AndroidSetupを開く。 AndroidSetupのResourcesDefinitionはGooglePlayConsole⇒Playゲームサービス⇒設定と管理⇒設定⇒リソースを取得からコピペ。 ClientIDは同じく設定にあるゲームサーバーのOAuthクライアントIDから。(ウェブアプリケーションのクライアントID) Setupボタンを押して完了 実行ファイルの生成とアップロード ビルドをする。 この時2回目のビルドになるのでバンドルバージョンを過去の物より高くしないとアップロードが通らないので注意。 APKが出力できたら新しいリリースをアップロードして公開する 画面を進めて内部テストとしての公開を開始で公開。 実行確認 テスターの追加時にコピーして、Androidデバイスに送ったリンクの下記画像のdownload it on GooglePlayのリンク先に飛べるようになるので、そこからアプリをダウンロードする。 あとは実機でダウンロードボタンを押してGoogleのOAuth確認画面が出て進めることができれば成功。 お疲れ様でした。 PlayFabにログインできたかどうかのチェックは、コード内でも実装できるが下記のように各タイトルのページからユーザーが生成されたかどうかで確認することもできる。検索で出てこない時は何度か押すと出てくる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift だけで Unity の iOS の Native Plugin を作る

Swift だけで Unity の iOS の Native Plugin を作る Unity は Native Plugin を作成することで、Unity から提供されていない、OS 固有の機能を使用することができます 例えば iOS では、Bluetooth や MP4 動画の作成、アルバムの利用などが出来るようになります これらの Native の機能を Swift で実装し、C# から呼び出す手順です Swift Package Manager (以下 SwiftPM) を使って、Framework を作成し、Unity に組み込みます ついでに、ライブラリの開発用の Native のアプリターゲットを作成します Framework 化するメリット PostProcess の設定が不要です Unity の Inspector 上で Embed の設定が完了します 合わせて Native でアプリターゲットを実装する事で、動作確認のために Unity のビルドをせずに、ライブラリの開発が可能です 今回の話のリポジトリです↓ やりたい事 今回は、Swift で文字列型の数値を long 型に変換する Native Plugin を実装します [DllImport("__Internal")] を付けて定義された、関数 swiftPmPlugin_toNumber が Swift で実装された関数です 今回は、C# にも存在する機能ですが、呼び出した先の Swift で iOS 固有の機能を利用することが可能です → https://github.com/fuziki/UnityPluginXcodeTemplate/blob/develop/Examples/UnityExample/Assets/Scripts/Cube.cs public class Cube : MonoBehaviour { // Swift で実装された関数の定義 [DllImport("__Internal")] private static extern long swiftPmPlugin_toNumber(string numberString); void Update() { // 呼び出し Debug.Log("number is: " + swiftPmPlugin_toNumber("30")); } } Native Plugin の実装 Swift Package Manager (SwiftPM) を使って実装し Framework を出力します 上記の swiftPmPlugin_toNumber が実装された SwiftPmPlugin.framework を作成します 環境 maxOS 11.3.1 Xcode 12.5 Swift 5.4.0 Unity 2020.3.5f1 Swift Package Manager type に libraryを、name に 作りたいパッケージの名前 (今回は SwiftPmPlugin) を指定して、package を初期化します library package が作成されるので、Package.swift を開きます Xcode が起動するので、SwiftPmPlugin.swift に実装していきます swift package init --type=library --name=SwiftPmPlugin open Package.swift SwiftPmPlugin の実装 Swift でロジックを実装します SwiftPmPlugin クラスに、文字列を数値に変換する toNumber 関数を実装しました Int(string) ?? 0 として数値変換に失敗したときは、0 を返すようにしました → https://github.com/fuziki/UnityPluginXcodeTemplate/blob/develop/Sources/SwiftPmPlugin/SwiftPmPlugin.swift class SwiftPmPlugin { var text = "Hello, World!" static func toNumber(string: String) -> Int { return Int(string) ?? 0 } } Swift で関数を公開する Swift で公開する関数を作成します @_cdecl を使って、C の関数として定義します char 配列のポインタを受け取って、Swift の String 型に変換します 先ほど作った SwiftPmPlugin.toNumber を使って、String から Int に変換します C# で定義した関数が戻り値が long 型で 64bit 整数なので戻り値も、揃えます @_cdecl("swiftPmPlugin_toNumber") public func swiftPmPlugin_toNumber(_ stringPtr: UnsafePointer<CChar>?) -> Int64 { let str = String(cString: stringPtr!) return Int64(SwiftPmPlugin.toNumber(string: str)) } Framework でビルドする SwiftPM から xcodeproj を出力して xcodebuild を使って出力した xcodeproj から framework を作成します CONFIGURATION_BUILD_DIR に指定したディレクトリに、SwiftPmPlugin.framework 作成されています swift package generate-xcodeproj --skip-extra-files xcodebuild -project SwiftPmPlugin.xcodeproj -scheme SwiftPmPlugin-Package -configuration Release -sdk iphoneos CONFIGURATION_BUILD_DIR=. Framework の Headers を確認すると、先ほど実装した swiftPmPlugin_toNumber が公開されていることが分かります open SwiftPmPlugin.framework/Headers/SwiftPmPlugin-Swift.h Unity でビルドする Framework の設定 Plugins/iOS/ を作成して、SwiftPmPlugin.framework を配置します SwiftPmPlugin.framework の Inspector で、Add To Embedded Binaries を有効にします Add To Embedded Binaries を有効にすることで、ビルドしたときに Framework が自動で Embed され ます iOSアプリをビルドする Unity で、通常通り iOS 向けにビルドします PostProcess などは、設定していないです 作成した target の frameworks に、SwiftPmPlugin.framework があり、 Embed の項目が、Embed & Sign になっていることを確認します 自動で追加されていない場合は、Unity の設定に失敗している可能性があります 手動で追加しても問題ないです 確認できれば通常通り iOS アプリを実行できるはずです Framework 開発用の Native のアプリターゲットを作る Framework の開発が便利になる tips 的なやつです Unity で使う Framework の動作確認のために、Framework のビルド→Unityのビルド→iOSのサイクルを回すのは大変です そこで、SwiftPM で作ったライブラリを取り込んだ、アプリターゲットを作成し、開発すると効率的だと考えています xcworkspace を作成する xcworkspace を作成し、Package を取り込み、アプリターゲットのターゲットを用意します ※ アプリを Objective-C で作る必要はないです、Swift でも問題ないです アプリターゲットの Frameworks に SwiftPmPlugin を追加します コードから呼び出すことが可能なので、呼び出します #import "ViewController.h" @import SwiftPmPlugin; @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSLog(@"value: %lld", swiftPmPlugin_toNumber("20")); } @end Swift からも呼び出すことが可能です import SwiftUI import SwiftPmPlugin struct ContentView: View { var body: some View { Text("number: \(swiftPmPlugin_toNumber("20"))") .padding() } } おわりに Native Plugin を実装することで、ゲームの開発は Unity に集中しつつ、OS 固有の機能を十分に利用することが可能です Swift で実装し、SwiftPM で管理し、Native アプリで動作確認することで、効率的な開発を目指しています
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む