- 投稿日:2021-01-18T22:54:03+09:00
初心者がUnity用のモデルを作る①サイコロ
開発環境
- MacBookAir 2019
- Unity 2019.4.14f1 (LTS)
- blender 2.83.10 (LTS)
はじめに
Unityで自作の3Dモデルを使えたらと思うと、すごくワクワクしてきますね!
自作の人型モデルを作ってUnityでグリグリ動かせるようになるのが最終目標ですが、
プロの方がモデリングの初心者はサイコロ > 宝箱 > 車 の順番でやりなさいとおっしゃっていたので、その順番でやってみようと思いますできたもの
サイコロのモデリングで学べること
- 最低限のモデリングツール(blender)を使う方法
- 各面への別々の絵(テクスチャ)を貼る方法
blenderのインストールと初期設定
blenderはバージョンによってGUIが大幅に変わります
最新のLTS版だった2.83LTSを使うことにしました
日本語化は私の環境では文字化けしてしまったのでしていません
- blenderの公式サイトからダウンロードする(https://www.blender.org/)
- Download > Long-Term Support
- LTS Release 2.83.10の下のDownloadからblender-2.83.10-macOS.dmgをダウンロードする
- blenderをインストール
- ダウンロードしたdmgファイルをダブルクリック
- blenderフォルダをApplicationフォルダにドラッグ&ドロップ
- blenderの初期設定
- メニューバーのEdit > Preference
- Input > Keyboard > Emulated Numpad にチェックを入れる
- Navigation > Orbit & Pan > Auto Perspective のチェックを外す
- Keymap > Preferences > Spacebar Action でToolsを選択
メッシュを作成する
テクスチャを用意する
UV編集画面を表示する
blenderの上部にあるタブ > UV Editing をクリックしてUV編集画面を出す(戻すときはLayoutタブをクリック)
(左側画面がUVEditor画面、右側画面が3DViewport画面という名前)
UV編集をする
UV展開された一番下の四角形を切り出す
3DViewport画面の左上の「Edit Mode」の右にあるアイコンからface selectをクリック
3DViewport画面からUVEditor画面の一番下の面に対応する面を探して選択する(マウスホイールの中ボタンのドラッグで視点変更)
UVEditor画面の左上のアイコンからUV selection modeのfaceをクリック
UVEditor画面で表示されている四角形を選択してオレンジ色にする
UVEditor画面の左側のツールの中からMoveを選択してマウスでドラッグ&ドロップ移動(これで切り取りになる)
切り出した四角形を移動して全体を拡大する
3DViewport画面でキーボードの「a」をクリックしてすべてを選択
UVEditor画面でMoveとScaleを使って全体に広がるように編集
テクスチャを書き出してメッシュに適用する
UVEditor画面の上にあるタブからUV > Export UV Layoutを選択して適当な場所に保存(今回はCube.png)
UVEditor画面での上にあるたぶからImage > Openから先程保存したテクスチャを開く
3DViewport画面の左上にあるコンボボックスからObjectModeを選択
3DViewport画面の右上にあるアイコンからMaterial Previewを選択
一番右側の縦にタブが並んでいる画面からMaterial Propatiesを選択
Material Propatiesの中に最初からあるMaterialのBase Colorの右端にある「○」をクリックしてImage Textureを選択
Base Colorのしたの項目から先程書き出したテクスチャを選択
テクスチャペイント画面を表示する
blenderの上部にあるタブ > Texture Paint をクリックしてテクスチャペイント画面を出す(戻すときはLayoutタブをクリック)
(左側がImageEditor画面になる)サイコロの目の位置がわかるように書き込んで保存する
マウスでお絵かき感覚でサイコロの目を描く、あくまで位置取りなので適当(左側の画面でも、右側の画面でも描ける)
ImageEditor画面からImage > Saveで保存するテクスチャをペイントソフトできれいに描く
保存したテクスチャ画像を清書する(今回は超適当ですが)
ここは解説省略しますが、私は無償のペイントツールFireAlpacaで書きました
blenderにもどって反映させる
blenderのImageEditor画面からImage > Reload
Unityにインポートする
blenderのFile > Export > FBX(.fbx)でモデルを書き出し
UnityプロジェクトのAssetsフォルダに書き出したFBXファイルとテクスチャファイルを保存する
Unityでゲーム画面に召喚!
- 投稿日:2021-01-18T17:59:18+09:00
Unity Input System
環境
Unity2019.4.16
OS : windows10 pro
IDE : VS2019 free概要
InputSystemを使用するにはUnity 2019.1以降+および.NET 4ランタイムが必要
感想
GUIのコードは10万行以上書いたけど、
こういうのベタ書きした方が早いと思う...Unityの新しい入力システムInputSystemを使ってみる
メモ1
・Package ManagerでInputSystemをインストール
・Net4.0にする
・上記の[Player]-[Active Input Handling]をBothまたはInput System Package(New)にする
・Createボタンを押すUnity再起動します。次の画面になります。
対応したいキーボード、マウス、VR(Oculus)などのデバイスを追加する。
アクション設定ファイル
- 投稿日:2021-01-18T16:22:09+09:00
Unity2020でPackageManagerからVector Graphicsをインストールできない(見つからない)場合の対処法
- 投稿日:2021-01-18T00:29:18+09:00
UnityのAsyncOperation.isDoneでtrueになるやつとならないやつ
前提
タイトルで、「trueになるやつとならないやつ」と書いていますが、結果的にはどちらもtrueになります。
しかし、trueになるタイミングが少し感覚と違うので、そこの違いをこの記事でははっきりさせたいと思います。Unityの非同期ロード系の関数で、
- シーンを非同期でロードする、SceneManager.LoadSceneAsync()
- Resourcesのアセットを非同期で読み込むResources.LoadAsync<T>()
みたいなのがあると思います。(AssetBundleは一旦無視で進行します)そしてこの2つはともに、
UnityEngine.AsyncOperation
を返します。
※Resources.LoadAsync<T>()
はResourceRequest
を返しますが、AsyncOperation
を継承しているので実質同じ。しかし、この2つの
AsyncOperation
はAsyncOperation.isDone
をきちんと返してくれるのでしょうか?以前にそこで詰まって頭の中で個チャゴチャになっていたので、もう一度検証してみました。検証用コード
using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; public class LoadAsyncTest : MonoBehaviour { void Start() { StartCoroutine(Verify_LoadSceneAsync("scenename")); StartCoroutine(Verify_LoadAsync("path")); } IEnumerator Verify_LoadSceneAsync(string name) { AsyncOperation operation = SceneManager.LoadSceneAsync(name); operation.allowSceneActivation = false; while (!operation.isDone) { Debug.Log(operation.progress * 100f + "%読み込み完了"); yield return null; } yield return new WaitForSeconds(0.5f); operation.allowSceneActivation = true; } IEnumerator Verify_LoadAsync(string name) { ResourceRequest operation = Resources.LoadAsync(name); while (!operation.isDone) { Debug.Log(operation.progress * 100f + "%読み込み完了"); yield return null; } yield return new WaitForSeconds(0.5f); Instantiate((GameObject) operation.asset); } }
LoadLevelAsync()
ではシーンを非同期でロードして、whileでisDoneがtrueになるまで待っています。
LoadAssetAsync()
ではResourcesのアセットを非同期でロードして、同様の処理を行っています。検証結果
ScneneManager.LoadSceneAsync() Resources.LoadAsync() isDone false true 状態 isDoneが一生trueにならないのでスタック きちんとtrueになり、インスタンス化も成功 そうなんです。LoadSceneAsync()のときのみ、isDoneがtrueにならずスタックします。
同様に、コード内のoperation.progress
も0.9fで止まってしまいます。
この場合のisDoneは、シーン遷移が完了してからtrueになるのでロードした段階ではfalseです。
Resources.LoadAsync()
は、ロード完了した段階でisDoneがtrueを返してくれるので、普通に使っても問題ないと思います。検証は以上です。何か記事の中に問題がありましたら、コメントにてご指摘お願いします!