20210118のUnityに関する記事は4件です。

初心者がUnity用のモデルを作る①サイコロ

開発環境

  • MacBookAir 2019
  • Unity 2019.4.14f1 (LTS)
  • blender 2.83.10 (LTS)

はじめに

Unityで自作の3Dモデルを使えたらと思うと、すごくワクワクしてきますね!
自作の人型モデルを作ってUnityでグリグリ動かせるようになるのが最終目標ですが、
プロの方がモデリングの初心者はサイコロ > 宝箱 > 車 の順番でやりなさいとおっしゃっていたので、その順番でやってみようと思います

できたもの

スクリーンショット 2021-01-18 22.20.58.png

サイコロのモデリングで学べること

  1. 最低限のモデリングツール(blender)を使う方法
  2. 各面への別々の絵(テクスチャ)を貼る方法

blenderのインストールと初期設定

blenderはバージョンによってGUIが大幅に変わります
最新のLTS版だった2.83LTSを使うことにしました
日本語化は私の環境では文字化けしてしまったのでしていません

  1. blenderの公式サイトからダウンロードする(https://www.blender.org/)
    1. Download > Long-Term Support
    2. LTS Release 2.83.10の下のDownloadからblender-2.83.10-macOS.dmgをダウンロードする
  2. blenderをインストール
    1. ダウンロードしたdmgファイルをダブルクリック
    2. blenderフォルダをApplicationフォルダにドラッグ&ドロップ
  3. blenderの初期設定
    1. メニューバーのEdit > Preference
      1. Input > Keyboard > Emulated Numpad にチェックを入れる
      2. Navigation > Orbit & Pan > Auto Perspective のチェックを外す
      3. Keymap > Preferences > Spacebar Action でToolsを選択

メッシュを作成する

もうすでに作られているので終了!
スクリーンショット 2021-01-18 20.30.57.png

テクスチャを用意する

UV編集画面を表示する

blenderの上部にあるタブ > UV Editing をクリックしてUV編集画面を出す(戻すときはLayoutタブをクリック)
(左側画面がUVEditor画面、右側画面が3DViewport画面という名前)
スクリーンショット 2021-01-18 20.37.20.png

UV編集をする

UV展開された一番下の四角形を切り出す

3DViewport画面の左上の「Edit Mode」の右にあるアイコンからface selectをクリック
3DViewport画面からUVEditor画面の一番下の面に対応する面を探して選択する(マウスホイールの中ボタンのドラッグで視点変更)
UVEditor画面の左上のアイコンからUV selection modeのfaceをクリック
UVEditor画面で表示されている四角形を選択してオレンジ色にする
UVEditor画面の左側のツールの中からMoveを選択してマウスでドラッグ&ドロップ移動(これで切り取りになる)
スクリーンショット 2021-01-18 21.05.50.png

切り出した四角形を移動して全体を拡大する

3DViewport画面でキーボードの「a」をクリックしてすべてを選択
UVEditor画面でMoveとScaleを使って全体に広がるように編集
スクリーンショット 2021-01-18 21.11.29.png

テクスチャを書き出してメッシュに適用する

UVEditor画面の上にあるタブからUV > Export UV Layoutを選択して適当な場所に保存(今回はCube.png)
UVEditor画面での上にあるたぶからImage > Openから先程保存したテクスチャを開く
3DViewport画面の左上にあるコンボボックスからObjectModeを選択
3DViewport画面の右上にあるアイコンからMaterial Previewを選択
スクリーンショット 2021-01-18 21.20.59.png

一番右側の縦にタブが並んでいる画面からMaterial Propatiesを選択
Material Propatiesの中に最初からあるMaterialのBase Colorの右端にある「○」をクリックしてImage Textureを選択
Base Colorのしたの項目から先程書き出したテクスチャを選択
スクリーンショット 2021-01-18 21.29.16.png

テクスチャペイント画面を表示する

blenderの上部にあるタブ > Texture Paint をクリックしてテクスチャペイント画面を出す(戻すときはLayoutタブをクリック)
(左側がImageEditor画面になる)

サイコロの目の位置がわかるように書き込んで保存する

マウスでお絵かき感覚でサイコロの目を描く、あくまで位置取りなので適当(左側の画面でも、右側の画面でも描ける)
ImageEditor画面からImage > Saveで保存する

テクスチャをペイントソフトできれいに描く

保存したテクスチャ画像を清書する(今回は超適当ですが)

ここは解説省略しますが、私は無償のペイントツールFireAlpacaで書きました
スクリーンショット 2021-01-18 21.55.14.png

blenderにもどって反映させる

blenderのImageEditor画面からImage > Reload
スクリーンショット 2021-01-18 21.57.28.png

Unityにインポートする

blenderのFile > Export > FBX(.fbx)でモデルを書き出し
UnityプロジェクトのAssetsフォルダに書き出したFBXファイルとテクスチャファイルを保存する
Unityでゲーム画面に召喚!

スクリーンショット 2021-01-18 22.20.58.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity Input System

環境

Unity2019.4.16
OS : windows10 pro
IDE : VS2019 free

概要

InputSystemを使用するにはUnity 2019.1以降+および.NET 4ランタイムが必要

感想

GUIのコードは10万行以上書いたけど、
こういうのベタ書きした方が早いと思う...

Unityの新しい入力システムInputSystemを使ってみる

image.png

メモ1

・Package ManagerでInputSystemをインストール
・Net4.0にする
・上記の[Player]-[Active Input Handling]をBothまたはInput System Package(New)にする
・Createボタンを押す

Unity再起動します。次の画面になります。

image.png

対応したいキーボード、マウス、VR(Oculus)などのデバイスを追加する。
image.png

アクション設定ファイル

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity2020でPackageManagerからVector Graphicsをインストールできない(見つからない)場合の対処法

2020にアップデートしたら、Packageがみつからない現象に合い焦りました。

対処法

1.Window->PackageManager で PackageManagerを開く
2.赤丸で囲んだ歯車アイコンをクリック->AdvancedProjectSettingsを開く
image.png
3.EnablePreviewSettingsをOn
image.png
4.PackageManagerの画面に戻り、左上の+ボタンからAdd package from git URLを選択
image.png
5.「com.unity.vectorgraphics」を入力

これでインストールが行えるはずです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityのAsyncOperation.isDoneでtrueになるやつとならないやつ

前提

タイトルで、「trueになるやつとならないやつ」と書いていますが、結果的にはどちらもtrueになります。
しかし、trueになるタイミングが少し感覚と違うので、そこの違いをこの記事でははっきりさせたいと思います。

Unityの非同期ロード系の関数で、
- シーンを非同期でロードする、SceneManager.LoadSceneAsync()
- Resourcesのアセットを非同期で読み込むResources.LoadAsync<T>()
みたいなのがあると思います。(AssetBundleは一旦無視で進行します)

そしてこの2つはともに、UnityEngine.AsyncOperationを返します。
Resources.LoadAsync<T>()ResourceRequestを返しますが、AsyncOperationを継承しているので実質同じ。

しかし、この2つのAsyncOperationAsyncOperation.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を返してくれるので、普通に使っても問題ないと思います。

検証は以上です。何か記事の中に問題がありましたら、コメントにてご指摘お願いします!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む