- 投稿日:2020-11-21T22:48:32+09:00
Unity 2020.1 でPackageManagerに出てこなくなったパッケージを使う
Unity2020.1以降ではパッケージマネージャーも整理されたようで、
基本的にはPreviewパッケージはインストールできなくなりました。
このBlogにある手順を踏むと一部のPreviewパッケージは表示されるようになるのですが、それでもほとんどのPreviewパッケージは表示されないようです。
今回、最新のARCoreSDKを試すにあたり、Unity2019.4ではAndroidのビルドを通すのにとても手間がかかるようになっていたため、2020.1を使ってインストールを試みたのですが、
これらのパッケージをインストールしようとしたところ、2020.1ではPreviewをONにしても出てきませんでした。いろいろ試したところ、下記の手順でパッケージのインストールを行うことができました。
- Projectを閉じた状態で、Assetsと同階層にあるPackagesフォルダの中のmanifest.jsonを開く
- WEBブラウザでインストールしたいパッケージ名を検索し、パッケージのドキュメントを表示する (例えば上述のMultiplayer HLAPIのドキュメント)
- ドキュメントには com.unity.multiplayer-hlapi といったパッケージ名および 1.0.6 といったバージョンが記載されているので、これを manifest.json に追加する
manifest.json{ "dependencies": { "com.unity.collab-proxy": "1.3.9", "com.unity.ide.rider": "1.2.1", : "com.unity.modules.xr": "1.0.0", "com.unity.xr.legacyinputhelpers": "2.1.4", "com.unity.multiplayer-hlapi": "1.0.6" } }4.Unityを起動すると自動的にパッケージがインストールされる
5.ドキュメントの記載より新しいバージョンがある場合はUpdateすることも可能
以上です。他にもっと良い方法があれば教えてください。
ここ
でなんとかできないですかね?では!
- 投稿日:2020-11-21T19:47:24+09:00
(CLUSTERで使う)雑VRMキャラをつくる。
(1)まずUnitynoプロジェクトを作ります。
Unity Hubを立ち上げ(ここでは 2019.4.11f1 のバージョンを使いました)
「プロジェクト」タブから「新規作成」をクリックします。
①適当なプロジェクト名(ここではEasyVRM)②保存先(それぞれのPCで適当に)を指定して
③作成をクリックします。
(2)Humanoid対応キャラクタのインポート
雑VRMのもとになるキャラクターとしてはあまり癖のないシンプルなものがいいです。
ここではキューブで作られたユニティちゃん「MCUnitychan」を使います。
ユニティちゃんのページ (https://unity-chan.com/) の左上「DATA DOWNLOAD」をクリック
一番下までスクロールライセンスに同意をチェック&「データをダウンロードする」をクリック
真ん中ぐらいまでスクロールして「MCUnitychan」のところの「DOWNLOAD」をクリック
しかるべき場所に MCUnitychan.unitypackage というファイルがダウンロードされます。
Unityに戻ってメニューバーの Assets > Import Package > Custom Package をクリック
先ほどダウンロードした MCUnitychan.unitypackage を選択し「開く」をクリックすると
というウインドウが開くので右下の「Import」ボタンを押します。(3)MCUnitychan をいろいろいじる。
無事インポートされるとProjectタブのAssets > MCUnitychan > Models フォルダの下に
MCunitychanというモデルがあるので「Hierarchy」のところにドラッグ&ドロップします。
シーンに現れたモデルはプレハブ化されているます。
このあといろいろいじるのでまずプレハブをアンパック
まずはテクスチャを入れ替えます。
MCUnitychan のテクスチャは Assets > MCUnitychan > Models > Materials フォルダの中の
mctex.png というファイルなので、同じフォルダにしたの画像を入れます。
(画像を右クリック「名前を付けて画像を保存」で上記のフォルダに保存してください)
「Hierarchy」上のモデルを開いてみると
arm_L ・・・ 左手
arm_R ・・・ 右手
body ・・・ 体
head ・・・ 頭
Leg_L ・・・ 左足
Leg_R ・・・ 右足
の6つの体の各部分と
Character1_Reference という各パーツの関係を決める部分でできているのがわかります。
先ほどダウンロードした画像を6つの体の各部分にそれぞれドラッグ&ドロップします。
テクスチャは次のように頭、足、体、手の領域に分かれています。
(ピンクの部分はどこにも割り付けられていない部分)
さらに各領域の中は直方体の各面にあたる8つの領域に分かれていいます。
この領域に合わせていろいろ絵を描いたり写真コピペしたりするとオリジナルのキャラクタが作れます。
例えばこんな感じw(4)VRMへの下ごしらえ
VRMにするためにちょっと Character1_Reference の中身をいじるといいようです。
「MCUnitychan」はそのままだと手が下を向いてます。
Character1_Reference > CH_Hips > CH_Spine > CH_Chest > CH_Shou_L > CH_Uppe_L (左手)
Character1_Reference > CH_Hips > CH_Spine > CH_Chest > CH_Shou_R > CH_Uppe_R (右手)
を選択すると Inspector > Transform > Rotation > Z が約90度になっているので
ここを左右とも0を入れます。
他にも、好みですが、少し細めにしたりチョコチョコいじります。
こんな感じになりました。(5)UniVRMの導入
「VRM Unity」でググるといろいろ出てきます(https://styly.cc/ja/tips/unity-fbx2vrm/ とか)。
詳しくはそのあたりを読んでもらうとして、
まずは https://github.com/vrm-c/UniVRM/releases から最新の.unitypackageをダウンロードします。
(2)での「MCUnitychan」と同様に Assets > Import Package > Custom Package で
ダウンロードしたファイルを選択、「Import」ボタンを押してインポートします。(6)VRM への変換
普通はモデルデータにエラーがないかなどいろいろ調整が必要なようですが、
今回の「MCUnitychan」はエラーが出なかったのでそのまま VRM に変換します。
メニューに追加された
VRM > UniVRM-0.62.0 > Export humanoid
をクリックします。
下の画面が出てきて Title、Version、Author が必要など言ってくるので適当に入れます。
「Export」をクリックし適当なファイル名を入れてやると
無事 .vrm ファイルを生成することができました。cluster(https://cluster.mu/) でアカウントを作ってログイン、
メニューの中からアバターの項目を選び先ほどの .vrm ファイルをアップロードしてやると…
無事に cluster のワールドにオリジナルキャラクタ(?)を入れこむことができました。(88888888)
- 投稿日:2020-11-21T18:51:13+09:00
【Unity】Getcomponentがめんどくさいのでpublic staticで爆速でコードを書く。
public staticに至った経緯
Unityでゲームを作っているときにほぼ必須のGetcomponent。
自分はスクリプトの変数を違うスクリプトから取得したいときによく使うのですが、毎回GetComponent<>()とかを使って、<>←これの中にはクラス名をいれて...などとしていては、とても面倒ですし他にやり方がないものか、と思っていたら、シングルトン1であるならば、public staticで直接他のスクリプトから変数を取得できるやり方があるらしいです。書いてみた
SingletonScript.C#public class Player : MonoBehaviour { public static Player player; //public staticして、クラスの名前を書いて、適当な変数(ここではplayerとする)を宣言 public int playerHp = 100; void Start(){ player = this; } }このスクリプトのplayerHpを他のスクリプト(ここでは敵スクリプト)から取得したい場合、
プレイヤーの体力変数が欲しい敵.C#public class Enemy : MonoBehaviour { void Start(){ Player.player.playerHp--;//クラス名.変数名.変数で、Playerクラスの変数を取得できる。Playerで宣言したこと(int playerHp等)がplayerに入っているイメージ } }スクリプトの内容は、Startが呼び出されたときにplayerHpから1引くという処理になります。
この場合、Playerの中身が入っているplayerの中のplayerHpを取得したいので . ←をつけています。
ただ、class Playerのスクリプトにplayer = this;という記述があります。
これは何なのかというと、playerという変数をインスタンス化しているようです。もともとPlayerというクラスで宣言したことは設計図のような状態なので、他のスクリプトがその設計図を取得したい場合はインスタンス化をする必要があり、thisという自分自身のインスタンスを表すものをplayerに代入して、設計図からインスタンス化をさせているわけですね。注意点
public staticはとても便利ですが、似ているクラス名(enemy1 enemy2など)をpublic staticしてしまうと、いざ使ってみようと思った時に検索候補で訳がわからなくなってしまうので、クラス名は間違えにくい名前を付けましょう。
終わり
拙い記事ですが読んでいただきありがとうございました。
シングルトンとはクラスのインスタンスが一つだけになるように設計すること ↩
- 投稿日:2020-11-21T18:51:13+09:00
Getcomponentがめんどくさいのでpublic staticで爆速でコードを書く。【Unity】
public staticに至った経緯
Unityでゲームを作っているときにほぼ必須のGetcomponent。
自分はスクリプトの変数を違うスクリプトから取得したいときによく使うのですが、毎回GetComponent<>()とかを使って、<>←これの中にはクラス名をいれて...などとしていては、とても面倒ですし他にやり方がないものか、と思っていたら、シングルトン1であるならば、public staticで直接他のスクリプトから変数を取得できるやり方があるらしいです。書いてみた
SingletonScript.C#public class Player : MonoBehaviour { public static Player player; //public staticして、クラスの名前を書いて、適当な変数(ここではplayerとする)を宣言 public int playerHp = 100; void Start(){ player = this; } }このスクリプトのplayerHpを他のスクリプト(ここでは敵スクリプト)から取得したい場合、
プレイヤーの体力変数が欲しい敵.C#public class Enemy : MonoBehaviour { void Start(){ Player.player.playerHp--;//クラス名.変数名.変数で、Playerクラスの変数を取得できる。Playerで宣言したこと(int playerHp等)がplayerに入っているイメージ } }スクリプトの内容は、Startが呼び出されたときにplayerHpから1引くという処理になります。
この場合、Playerの中身が入っているplayerの中のplayerHpを取得したいので . ←をつけています。
ただ、class Playerのスクリプトにplayer = this;という記述があります。
これは何なのかというと、playerという変数をインスタンス化しているようです。もともとPlayerというクラスで宣言したことは設計図のような状態なので、他のスクリプトがその設計図を取得したい場合はインスタンス化をする必要があり、thisという自分自身のインスタンスを表すものをplayerに代入して、設計図からインスタンス化をさせているわけですね。注意点
public staticはとても便利ですが、似ているクラス名(enemy1 enemy2など)をpublic staticしてしまうと、いざ使ってみようと思った時に検索候補で訳がわからなくなってしまうので、クラス名は間違えにくい名前を付けましょう。
終わり
拙い記事ですが読んでいただきありがとうございました。
シングルトンとはクラスのインスタンスが一つだけになるように設計すること ↩
- 投稿日:2020-11-21T15:36:34+09:00
<自作>勉強でStateMachineを制作してみた
初めての投稿です!様々な意見を下さるととてもうれしいです!
今回は現在Unityを使用してゲーム制作をしているのですが、それで自分で制作したStateMachineを公開したいと思います!
プログラム歴約2年ほどですが、いろんな人に参考にしていただけると嬉しいです!コードはGitHubにも公開しているので良ければ見てみてください!
StateMachineIState
public interface IState { //始めに呼ばれる関数 StateTagList Enter(MonoBehaviour mono); //毎フレーム呼ばれる関数 StateTagList Execute(MonoBehaviour mono); //消去時に呼ばれる関数 StateTagList Exit(MonoBehaviour mono); }interfaceでStateの抽象クラスを制作しました。
これを継承していろいろなStateを制作していきます。
戻り値をenumのtagにしており戻り値によってStateを変更するようにしています。StateTagList
//タグと一緒にStateを追加する public enum StateTagList { none, move, move1, }enumでtagを制作しました。
Stateをリスト化してゲーム初めにすべてのStateをインスタンスしてtagと一緒に管理してやるために制作しました。
Stateの変更がないときはnoneを返すようにします。IStateを継承して作ったクラス
public class move : IState { GameObject gameObject = null; public StateTagList Enter(MonoBehaviour mono) { gameObject = mono.gameObject; return StateTagList.none; } Vector3 v3 = new Vector3(0.05f, 0, 0); public StateTagList Execute(MonoBehaviour mono) { gameObject.transform.position += v3; if (Input.GetKeyDown(KeyCode.C)) { return StateTagList.move1; } return StateTagList.none; } public StateTagList Exit(MonoBehaviour mono) { return StateTagList.none; } } public class move1 : IState { GameObject gameObject = null; public StateTagList Enter(MonoBehaviour mono) { gameObject = mono.gameObject; return StateTagList.none; } Vector3 v3 = new Vector3(-0.05f, 0, 0); public StateTagList Execute(MonoBehaviour mono) { gameObject.transform.position += v3; if (Input.GetKeyDown(KeyCode.C)) { return StateTagList.move; } return StateTagList.none; } public StateTagList Exit(MonoBehaviour mono) { return StateTagList.none; } }次はIStateを継承して作った子クラスです。
中身は今回はテスト用ということで”C”を押すと移動が左右切り替わるだけのシンプルなものにしています。StateList
public class StateList { //Dictionaryクラスのオブジェクト生成 private Dictionary<StateTagList, IState> statelist = new Dictionary<StateTagList, IState>(); //この関数でStateリストの追加 public void AddState(StateTagList _tag,IState _state) { statelist.Add(_tag, _state); } //ここにタグを引数として入れればそのStateがかえってくる public IState GetState(StateTagList _tag) { return statelist[_tag]; } }次に早速enumで作ったtagを使ってリスト化していきます。
管理方法はDictionaryクラスを使用していきます。
私は今回初めてDictionaryクラスを使ったのですが、とても便利でした!!
今までC++でネイティブ開発をしていたのですが、正直std::mapより使いやすくて好きです!!StateMachine
public class StateMachine { private IState state = null; private StateList stateList = new StateList(); public StateList GetStateList() { return stateList; } public IState GetState() { return state; } //Stateを変更する際に通す関数 //自動でEnterとExitに通るようになっている public void ChangeState(StateTagList _tag,MonoBehaviour _mono) { IState _state = stateList.Getstate(_tag); state?.Exit(_mono); state = _state; state?.Enter(_mono); } //StateMachineを持たせているscriptのUpdateでこの関数を回してやる //引数に自分のGameObjectを持たせてやる public void Update(MonoBehaviour _mono) { if(state != null) { StateTagList _tag = state.Execute(_mono); if (_tag != StateTagList.none) { ChangeState(_tag, _mono); } } } }最後に本題のStateMachineです。中身としてはStateの切り替えやStateの管理などをしています。
またStateを切り替えるとEnterとExitをに入るようにしています。
最近知ったのですが、State?.~~~~とすることでnull回避ができると聞いてとても便利だと感じました!!使用方法
public class EnemyController : MonoBehaviour { StateMachine state = new StateMachine(); void Start() { state.GetStateList().AddState(StateTagList.move, new move()); state.GetStateList().AddState(StateTagList.move1, new move1()); state.ChangeState(StateTagList.move1, this); } void Update() { state.Update(this); } }使用方法はシンプルです。StateMachineを変数宣言して初めに使うStateをすべてインスタンスしてListに入れてやります。そして初めに使うStateをChangeStateでセットしてやります。
最後にUpdateで自分自身を引数に入れてUpdateを回してやるだけです!最後に
今回初めて記事を書いたのですがどうでしょうか?
今回制作したStateMachineはもっと改良すればもっといいものになると思うので今後も改良してみたいと思います。またいろいろな意見を下さるととてもうれしいです!!
最後まで見て下さりありがとうございます!!