- 投稿日:2020-07-10T20:16:36+09:00
Error: unknown command "filter-proces" for "git-lfs"
概要
作業内容としては、UnityのプロジェクトをAzurePipelinesでCI/CD対応をやってました。
Unityビルド対応は後でiOS/AndroidのProjectビルドをGitにPushして、AzurePipelines標準のiOS/Androidビルドを適応してアプリが正常にビルドと起動ができるのか確認、正常起動のみアプリをAppCenterに配布する想定で進めておりました。Firebaseを使用しているので、
./Assets/Firebase/Plugins/x86_64/FirebaseCppApp-6_8_0.so
(約107M)がgit-lfs
が必須となりすでに対応は済ませていました。
ですが、ブランチ切り替えての作業でgit lfs track
でtrackedされているファイルが消えたり作られたりすると次のエラーが起き始めていました。
また、まずはiOSビルドを先にAzurePipelines対応しようと作業していたため、Xcodeプロジェクトをgit push
する際に./xcode/libraries/libiphone-lib.a
(約602M)もgit-lfs
対応していたました。$ git add . Error: unknown command "filter-proces" for "git-lfs" Did you mean this? filter-process Run 'git-lfs --help' for usage. fatal: The remote end hung up unexpectedlyこのエラーについてググってみるものの参考になる記事が全く見当たらなかったので本記事にまとめたいと思います。
解決
結果的にGit LFSの使用方法 - Backlog ヘルプセンター記事の内容を参考になりました!
解決方法はいたってシンプルで、
# もしcommitなりしていたadd前に戻す $ git reset --hard HEAD^ # `git-lfs`のtracked以外の編集内容を先にpushしておくと安全に作業できる # ただしCI/CD対応がすでに完了している環境だったらこのpushはエラーになるかもなのでそのときの状況に応じてよしなに $ git add . && git rm --cached -r ./xcode/libraries/libiphone-lib.a && git commit -m "Upload Xcode Project" && git push # `git-lfs`の設定をリセットさせるとエラーが無くなった・・・ $ git lfs install WARNING: The "filter.lfs.process" attribute should be "git-lfs filter-process" but is "git-lfs filter-proces" Run `git lfs install --force` to reset git config. $ git lfs install --force Updated git hooks. Git LFS initialized. $ git add . && git commit -m "add git lfs file" [develop xxxxxx] add git lfs file 1 file changed, 3 insertions(+) create mode 100644 Xcode/Libraries/libiPhone-lib.a $ git push原因
今回のミスは2点でした。
.gitattributes
とgit-lfs
のtrackedファイルを一緒にPushしようとしていたことRun 'git lfs install --force' to reset git config.
を無視していたこと1はそもそも
git-lfs
の使用方法をちゃんと把握していなかったことでした汗
2はリセットする意味が分からず怖くてできなかったんですが、お手上げになったこともありやってみたところエラーは無くなりましたwまとめ
ちゃんとツールの使用方法を把握しないとですねー
- 投稿日:2020-07-10T16:50:41+09:00
Playを押すたびに"Processing Addressable Group"と表示される。
やあ
備忘です。
あなたのAddressableのソースは毎回[Play!]を押すたびにビルドされてます。
※私はビルドする必要があるかチェックしているのも含めて"ビルド"と呼んでます。おおきく3つ手順があります。
1.プレイモードの変更
2.プロファイルの設定
3.Addressableのビルド1.プレイモードの変更
以下のように変更して下さい。
Play Mode Script > Use Existing Build(requires build groups)2.プロファイルの設定
適当なフォルダにビルドパス、ビルドローカルパスを変更します。
3.Addressableのビルド
Addressableのソース?を変更したら毎回実行してください。
以上です。
- 投稿日:2020-07-10T15:26:35+09:00
Unity 学習開始
2020.07.10
以前から気になっていたARアプリやソフトが作りたくて調べていたらUnityに出会いました。
Unityの開発者や参考文献、参考動画が多くあるので進めていくのに露頭に迷わなくて良さそうってのもあります。今日からUnity学習を始めます。(宣言しないと進められないので(笑))
学習参考URL
ユニティちゃんが教える!初心者向けUnity講座
https://www.udemy.com/course/unity-chan-tutorial-01/
今日からはじめるUnity
https://qiita.com/nmxi/items/7950fb12ef925efa276d
Unity初学者用URL集
https://qiita.com/nori0__/items/e03635481318dc983b9a他にも参考になるサイト、ページがあれば教えてください。
Qiitaの先生、先輩よろしくお願します。
- 投稿日:2020-07-10T14:29:28+09:00
Substance PainterでエクスポートしたテクスチャをUnityに取り込む
やりたいこと
Substance Painterで3Dペイントしたテクスチャをエクスポートして、Unityに取り込みます。
流れ
- オブジェクトを入れるフォルダを作成する
- オブジェクトを取り込む
- マテリアルを取り込む
- テクスチャを入れるフォルダを作成する
- マテリアルを取り込む
- ノーマルマップのテクスチャタイプを変更する
- オブジェクトにテクスチャを割り当てる
- シーンに地面を配置する
- シーンにオブジェクトを配置する
- カラースペースをLinerに変更する
詳細
1. オブジェクトを入れるフォルダを作成する
ProjectウィンドウのAssetフォルダ内で右クリックして、Create -> Folderを選択します。名称をObjectsに変更します。
2. オブジェクトを取り込む
Objectsフォルダ内に移動し、右クリックして、Import New Assetsを選択します。Substance Painterで作成したfbxデータを取り込みます。
3. マテリアルを取り込む
取り込んだオブジェクトをクリックし、InspectorウィンドウのLocationをUse External Materials (Legacy)、NamingをFrom Model's Materialにして、Applyボタンを押します。自動でMaterialsフォルダが作成され、中にマテリアルが保存されます。
4. テクスチャを入れるフォルダを作成する
ProjectウィンドウのObjectsフォルダ内で右クリックして、Create -> Folderを選択します。名称をImagesに変更します。
5. マテリアルを取り込む
Imagesフォルダ内に移動し、右クリックして、Substance Painterからエクスポートしたテクスチャをドラッグ&ドロップします。
6. ノーマルマップのテクスチャタイプを変更する
5で取り込んだノーマルマップをクリックし、InspetorウィンドウのTexture TypeをNormal Mapに変更し、Craete from Grayscaleをオフにし、Applyボタンをクリックします。
7. オブジェクトにテクスチャを割り当てる
3で作成されたMaterialsフォルダの中のマテリアルをクリックし、Main MapsのAlbedo、Metallic、Normal Map、Occulusion、Detail Maskの左の丸ボタンをクリックして、さきほど取り込んだ画像を割り当てます。
Albedo : XXXX_AlbedoTransparency.png
Metallic : XXXX_MetallicSmoothness.png
Normal Map : XXXX_Normal.png
Occlusion : XXXX_AO.png
8. シーンに地面を配置する
HierarchyウィンドウのCreate -> 3D Object -> Plane の順にクリックして、地面のオブジェクトを作成します。
9. シーンにオブジェクトを配置する
Projectウィンドウのcubeオブジェクトをシーンにドラッグ&ドロップして、シーンにオブジェクトを配置します。
10. カラースペースをLinerに変更する
メインメニューのEdit -> Project Settings -> Player -> Other Settings -> Color SpaceをGammmaからLinerに変更します。これでよりリアルになりました。
- 投稿日:2020-07-10T12:06:31+09:00
Unity上でPlayボタンを押すとオブジェクトの色が変わるスクリプト
やりたいこと
Unity上でPlayボタンを押すと、立方体の色が青からオレンジに変わるスクリプトを作成します。
Unityの画面構成、マウス操作、C#の基本などは以下の投稿を参考にしてください。
Unityとc#の超入門 ~基礎編~流れ
- オブジェクトを作成
- マテリアルを作成
- オブジェクトにマテリアルを追加
- スクリプトを追加
- スクリプトを編集
- 実行ボタンを押すと、オブジェクトの色が変わる
詳細
1. オブジェクトを作成
HierarchyウィンドウのCreate -> 3D Object -> Cube の順にクリックして、立方体のオブジェクトを作成します。
2. マテリアルを作成
ProjectウィンドウのAssetsフォルダ内で右クリックし、Create -> Materialを選択します。名称をtest_materialに変更します。
3. オブジェクトにマテリアルを追加
test_materialを、HierarchyウィンドウのCubeにドラッグ&ドロップします。これで、マテリアルをオブジェクトに結び付ける(アタッチする)ことができました。
4. スクリプトを追加
HierarchyウィンドウのCubeをクリックし、InspectorウィンドウのAdd Component -> New Scriptを選択します。名称を変更し、Create & addをクリックします。スクリプトが生成されました。
5. スクリプトを編集
生成されたスクリプトcolor_changeをダブルクリックし、Visual Studioを起動、以下のソースに変更し、保存します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class color_change : MonoBehaviour { // Start is called before the first frame update void Start() { // // 赤色に変更する gameObject.GetComponent<Renderer>().material.color = Color.red; } // Update is called once per frame void Update() { } }6. 実行ボタンを押すと、オブジェクトの色が変わる
- 投稿日:2020-07-10T11:03:15+09:00
Virtual Chara開発 - その5
店舗接客などに使える仮想のキャラクターが扱えるアプリ開発をしました。そちらの説明はこちらになります。
https://qiita.com/NestVisual/items/fe4dd168178e27156682環境:
Windows 10
Unity 2018.4.1
RealSense D435iキャラのアニメーション:
利用者の骨格が検出されなかったり、カメラと利用者の距離が遠すぎたり近すぎたりなど、様々な理由で骨格トラッキングが反映されないときに、モデルはその場で止まってしまいます。これは人形のように見えます。そして、モデルが不自然な状態にある場合は特に悪い。
これを変更するには、まずモデルの四肢の回転を元の状態にリセットしました。Quaternion.Lerp() メソッドを使用すると、スムーズに動きましたが、人間らしくありませんでした。人間は完全に静止していることはほとんどないので、少しだけ揺れる待機状態のループ再生アニメーションが必要だと思いました。
最大の問題は、モデルのトラッキング反映ポーズから、アニメーションの開始ポーズまでを自然に移動させることでした。単純にアニメーションを再生するだけでは、急に変化してしまいます。
現行のプロジェクトでは、アニメーションはすぐに再生されます。そして、再生前の四肢の回転を保存します。これからLateUpdate()でまたLerp()を使用して、関節の回転を設定します。これを行うには、Quaternion.Slerp()を使用します。これは2つの回転と、それらの影響を決定するブレンド比を受け取ります。この比率は、アニメーションの再生が始まったからの経過時間を基準にしています。保存した回転の影響が徐々に少なくなっていきます。
sample1.csprivate void LateUpdate() { BlendToMecanim(); } /// <summary> トラッキング反映からスムーズにMecanimにブレンド移行。Mecanimによってオーバーライドされないように、LateUpdateで呼ぶ </summary> private void BlendToMecanim() { _animator.SetBool("Idle", false); if (STATE != ControlState.BLEND_TO_ANIM) return; // Mecanimに移行したら過ごした時間 float timePassed = Time.time - reflectTrackingEndTime; // どれぐらい最後のトラッキングポーズを表す float trackingBlendRatio = 1.0f - timePassed / trackingToMecanimBlendTime; // 0から1まで trackingBlendRatio = Mathf.Clamp01(trackingBlendRatio); // 関節をtrackingBlendRatioぐらいで最後のトラッキング回転にオフセットする foreach (KeyValuePair<nuitrack.JointType, Quaternion> rotation in _jointRotationsBeforeMecanim) { ModelJoint modelJoint = _jointsRigged[rotation.Key]; modelJoint.bone.rotation = Quaternion.Slerp(modelJoint.bone.rotation, rotation.Value, trackingBlendRatio); } if (trackingBlendRatio == 0) STATE = ControlState.ANIMATED; }上記プログラムでは、カメラのトラッキングデータを、キャラのアニメーションに反映させます。同じシステムを他のアニメーションにも使用ができます。例えば、複雑な手のジェスチャーのようなトラッキングが難しいものです。BlendToMechAnimメソッドがUpdate()ではなくLateUpdate()で呼ばれるのは、アニメーションの次のフレームが更新されたの後に回転を設定するためです。Updateを使用した場合、アニメーションはブレンドされた回転を上書きしてしまいます。同じスクリプトには 「ControlState」という列挙もあります。これはキャラクターが骨格トラッキング、Unityでのアニメーション(mecanim)、mecanimに向かってブレンドされているときの状態を持っています。
次回はフェイストラッキングで顔を操るに関して投稿します。それではまた
- 投稿日:2020-07-10T10:32:23+09:00
Unityでスクリプトを作成し、Hello, Worldを表示する
やりたいこと
Unity上で実行ボタンを押すと、Hello, Worldが表示されるスクリプトを作成します。
Unityの画面構成、マウス操作、C#の基本などは以下の投稿を参考にしてください。
Unityとc#の超入門 ~基礎編~流れ
- オブジェクトを作成
- スクリプトを作成
- ゲームオブジェクトを作成
- スクリプトをアタッチ
- スクリプトを編集
- Hello Worldを表示
詳細
1. オブジェクトを作成
HierarchyウィンドウのCreate -> 3D Object -> Cube の順にクリックして、立方体のオブジェクトを作成します。
2. スクリプトを作成
Projectウィンドウ内で右クリックし、Create -> C# Scriptを選択します。Scriptの名称をtestに変更します。
3. ゲームオブジェクトを作成
スクリプトを動かすには、何らかのゲームオブジェクトと結びつける(アタッチする)必要があります。作成したスクリプトを動かすためにゲームオブジェクトを追加します。
HierarchyウィンドウのCreate -> Create Emptyを選択します。
4. スクリプトをアタッチ
testスクリプトを、HierarchyウィンドウのGameObjectにドラッグ&ドロップします。これで、スクリプトをゲームオブジェクトに結び付ける(アタッチする)ことができました。
5. スクリプトを編集
testスクリプトをダブルクリックすると、Visual Studioが起動し、スクリプトを編集できるようにになります。Hello, Worldと表示されるよう10行目にソースコードを追記します。Visual Studio上でスクリプトを保存します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class test : MonoBehaviour { // Start is called before the first frame update void Start() { Debug.Log("Hello, World"); } // Update is called once per frame void Update() { } }6. Hello Worldを表示
Unityに戻り、SceneビューにあるPlayボタンを押します。ConsoleウィンドウにHello, Worldが表示されました。
- 投稿日:2020-07-10T03:32:37+09:00
自分でゲームを作る一歩目
はじめに
『ゲームを作りたいけど、どこから手を付けたらいいのかわからない』そんなUnity初学者の人たちに、ゲームの構成要素という視点からオリジナル制作の一歩目を示せたらと思います。
ゲームを構成する要素
ビデオゲームに関わらず、いかなるゲームも物語とルールによって成り立っています。
物語はキャラクターやBGM、背景やストーリーによって表現され
ルールはプレイヤーの入力に対するレスポンス(ゲームの世界における因果律)として表現されますルールと物語はお互い切っても切り離せない関係にあります。
そして、この組み合わせにおける妙こそがある意味ゲームの醍醐味なのかもしれません。学習はルールからはじめよう
これはあくまで持論ですが、初学者の人はルールに関する学習からゲーム作りを進めるといいかもしれません。
ゲームとしておなじみの横スクロールや、シューティングゲーム、ブロック崩しや五目並べなどのルールがどのように実装されているのか知ることは、作成できるゲームの幅を広げてくれます。一方で物語を構成する要素は多く、その一つ一つが人生をかけて極めるに足るものです。加えて、その一つを極めたとしてもゲームの全体像はみえてきません…(例えば一流の音楽家がゲームを作れるかというと、そうではないですね)
物語の作成に求められる能力:グラフィック、音楽、UIUX、ストーリー、アニメーションなどの制作スキル
ルールの作成に求められる能力:コーディング、Unityというフレームワークの理解ルールを学ぶには
ルールを学び、コーディング能力とUnityの理解を高めるためには実際にゲームを作成することが大切です。
そして実際にゲームを作る一歩目としては、Unity公式の完成ゲームを用いる。もしくは、YouTubeの解説動画をみながらよくあるゲームの模写をするのが最適です。
YouTubeの解説動画の中ではスタジオしまづさんのサイトはとてもおすすめです。Tofuを恐れないで
ゲームのルールを学習する為に、デフォルトオブジェクトのCubeを利用してゲームをを作ることは何も間違っていません。まずはルールを実装することを意識して、Tofuを使って使って使い倒しましょう。世界で一番使われてきたObject=Tofu
Tofuでゲームを作ってもいいじゃない物語の味付けはAssetStoreで
ルールがしっかりと実装できたら、物語に欠かせないグラフィックやアニメーションはAssetStoreで補うのがいいでしょう。最初は無料のものから、慣れてきて少しお金を出してもいいと思えるようになったら有料のものを使うのもいいです。
最後に
本記事は自分自身がUnityを触る中で感じたこと、GeekSalonというプログラミングスクールで生徒さんのミニゲーム作成に携わってきた経験、そしてゲームに関する名著:Half-Realにインスパイアされた考えに基づき、つらつらと書き殴ったものです。ご意見や間違いの修正などはコメント欄へいただけると嬉しいです。
- 投稿日:2020-07-10T02:36:37+09:00
[Unity Editor拡張]ゲーミングUnityを作った
はじめに
ゲーミングUnityとは、皆さんご存じのゲーミングPCが七色に光るアレのUnityバージョンです
Editor拡張を使用して作成しました
開発効率が上がるとかそういう内容は一切ありません結果
ダウンロードはこちら
unitypackageになっています
https://github.com/kyourikey/GamingUnityEditorExtension/releases
環境
- Windows 10
- Unity 2018.4.19f1
解説
やっている事はシンプルです
- ウィンドウを作成して表示
- 虹色グラデーション画像をスクロールさせながら表示
- UpdateでRepaintを呼び再描画
おわりに
短いコードで気軽に作れるので、皆さんもEditor拡張でUnityの見た目を自分好みにカスタマイズしちゃいましょう!
おまけ
以前私が書いたEditor拡張の記事です
今回作ったものと近い内容なので、興味が有ればこちらもどうぞ!
- UnityEditor拡張でグラフを描く際に使用したメソッドの解説
こんな感じのUIがUnity上に表示できるEditor拡張です
参考サイト
- Unity - スクリプトリファレンス - EditorWindow.Show
- Unity - スクリプトリファレンス - GUI.DrawTexture
- Unity - スクリプトリファレンス - EditorWindow.Repaint
- 投稿日:2020-07-10T00:55:23+09:00
Unityで画像からobj形式ファイル作成
pngやjpegの画像をobjにしたいがさくっとする術が見つからん。。
Unityできたけど
ちょっと忘れそう、かつ、またはまりそうなので備忘録手順
画像を反映したMaterialを用意
unityのProjectビューの任意の場所にお目当ての画像をドラッグ&ドロップ
projectビューの任意のフォルダで右クリックから新規マテリアル作成
で、そのMaterialのInspectorビューからShaderを変更
Diffuseで検索したら出てくる「Mobile/Diffuse」にするで下記画像の様になっているので↓
赤枠のところにお目当て画像をドラッグ&ドロップするただこの状態だとなんか灰色がかった状態になってしまう。
そこで更にShaderを変更するとそれが回避出来る
UI > Defaultを選択する
これでMaterial完成
Materialを反映する3Dオブジェクト作る
HierarchyビューでPlaneオブジェクト作ってよしなにする。
とりあえず縦向けたかったり、サイズ適当に調整してこんな感じ
Materialを3Dオブジェクトに反映する
先ほど作ったMaterialを、これまた先ほど作ったPlaneオブジェクトにドラッグ&ドロップする反映される
UniVRMでglb形式でエクスポートする
UniVRMをインポートしてないひとは探してインポートしてください。
UniGLTF 1.28 > Export で適当に名前を付けてglb形式のファイルを無事出力。
これで完成よ。
- 投稿日:2020-07-10T00:14:43+09:00
Unity (C#) で小数点型の変数をintにキャストすると意図した値にならない(ように見える)ことがある
座標値をint型にする処理
int x = (int)hit.collider.gameObject.transform.position.x; Debug.Log("x1=" + hit.collider.gameObject.transform.position.x); Debug.Log("x2=" + x);Unityで書いてしまいそうな処理があります。
例えば、ボードゲーム系のゲームを作ろうとしたときに、クリックしたマスのボード上の座標を求めたいみたいなものがあると思います。hit.collider.gameObject.transform.position.xは2.0になっているつもりです。
intにキャストしているため、小数点以下は切り捨てになるはずなので2.5なら2や3.0なら3になってほしいわけですが..
このような結果になりました。
これは(原因を知らないと)おかしいと思ってしまいますね。
こういうので初心者さんが挫折してしまう理由にもなりかねないんですよね。ちなみに、キャストは四捨五入なんじゃないかとも言われそうですが
仕様としても切り捨てです。(厳密に言うと0に近い整数値)https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/numeric-conversions
原因を調べる (ToString)
初心者だと、なかなか発想が浮かびにくいですが、そもそもこの値は2.0じゃないのではないかという発想になりますが、これを検証するのは知らないとなかなか難しいです。
デバッガでステップ実行しても、デバッガの表示も
ToString()
での値になるので生の値がわかりません。ちなみに、Unityのposition.x などは float型 つまり
System.Single
型です。ドキュメントを見てみると、ToString()は ToString("G")の省略形のようですね。
"G" を見てみると、7桁の精度しかないようです。
System.Single
型のドキュメントを見ると、既定では、戻り値の精度は7桁のみですが、内部的には最大9桁が保持されます。
とあるので、9桁を出して見ると..
Debug.Log("x1=" + hit.collider.gameObject.transform.position.x.ToString("G9")); Debug.Log("x2=" + x);これで謎が少し解決しそうですね。
ということで表示上は2になってしまうが、実は1.99999967だったみたいです。
ちなみに
Debug.Log("x2=" + x);というのも、実は
ToString
が勝手に補完されます。Debug.Log("x2=" + x.ToString());ところで、ToString()はなんで切り上げになったのか
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-numeric-format-strings
精度指定子によって結果文字列内の小数部の桁数を制御する場合、結果文字列では無限に正確な結果に最も近い表現可能な結果に丸められた数値が反映されます。 同じように近い表現可能な結果が 2 つある場合は、次のようになります。
.NET Framework および .NET Core 2.0 までの .NET Core の場合、最下位の数字が大きい方の結果が選択されます (つまり、MidpointRounding.AwayFromZero が使用されます)。
.NET Core 2.1 以降の場合、ランタイムでは最下位の数字が同一である結果が選択されます (つまり、MidpointRounding.ToEven が使用されます)。とあります、
float f = 1.99999976f; Console.WriteLine(Math.Round(f, 6, MidpointRounding.AwayFromZero));というような処理が行われていると想像できます。
つまり丸められて切り上げになったんですね。つまり
class Program { static void Main(string[] args) { float f = 1.99999976f; Console.WriteLine(f); Console.WriteLine((int)f); Console.WriteLine(f.ToString("G9")); } }は
2 1 1.99999976という結果になります。
そもそも、そんな細かい値を使うの?
と思うかもしれませんが、UnityでGameObjectを作ったら、座標がランダムっぽい値で生成されるときがあります。
これをとくに気にせずに親のオブジェクトとして
Instantiate(guide , new Vector3(2, 0, 0) , Quaternion.identity, guideList.transform);のようなオブジェクトを作ると (2, 0, 0) はグローバル座標なので
生成後はこのようなローカル座標になります。
Unityはグローバル座標ではなく、どうもローカル座標から足し引きで求めているようで、本題のような微妙な座標値になることがあります。
なので上の座標値を (0,0,0) にするだけでも本題のバグが発生しない可能性が高いです。
ちなみに
transform.position
はグローバル座標で
transform.localPosition
は ローカル座標です。(インスペクタに表示されるのもこっち)まとめ
(int)
でキャストして切り捨てにすると意図しない挙動になる場合があるのでfloat f = 1.99999976f; int x = (int) Math.Round(f);のように四捨五入するのが安全かなと思います。