【Unity道場2】ゲームオブジェクトを表示、非表示
ゲームオブジェクトを表示、非表示をやります
【Unity道場1】座標を移動させる方法:問題文つき (Transformコンポーネント)
Unityの書籍を使っていくつかゲームを作った後に気付きました。
何も身についてねぇーーー!
本見ないと何にもできねxあーーー!
ということで、基本に立ち返って、ゲームを作る前にGameObjctの操作方法を
まず、1つ目!! Transformコンポーネント
問題1:ゲームオブジェクトのx座標を一定毎に増やせ
ゲームオブジェクトのx座標を一定毎に増やせ
解答例
using UnityEngine; public class Test : MonoBehaviour { Transform t; void Start() { t = this.gameObject.GetComponent<Transform>(); } // Update is called once per frame void Update() { Vector3 pos = t.position; pos.x += 0.1f; t.position = pos; } }
まず、取得したいゲームオブジェクトにこのTestスクリプトがAdd Componentされている前提です。
t = this.gameObject.GetComponent<Transform>();
この部分は、正確に書いたバージョンで、よく他の説明ページではより簡易的に
t = this.transform;
とか,さらにthisすら省略して
t = transform;
と書いている場合もありますが、こちらでもOK。だた、より内部構造を意識してプログラミングするなら前者の方がいいかと思います。
後、Update部の部分ですが
t.position.x += 0.1f
でもいいんじゃ。と思いがちですが、これだと動きません。
一度Vector3に入れて上げて、座標を修正し、元に戻すというような手順が必要
Vector3 pos = t.position; pos.x += 0.1f; t.position = pos;
問題2:ゲームオブジェクトのx座標を軸に回転させよ
ゲームオブジェクトのx座標を軸に回転させよ
解答例
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test2 : MonoBehaviour { Transform v; void Start() { v = this.gameObject.GetComponent<Transform>(); } // Update is called once per frame void Update() { Quaternion rot = v.rotation; rot.x += 0.01f; v.rotation = rot; } }
問題1との違いはVector3かQuaternionかの違いです。
あとはあんまり変わりません。
ちなみに、Quaternioは180が最大値なのでこのプログラムだと180まで行くと回転がとまります。
問題3:ゲームオブジェクトのx座標成分に大きさを変えよ!
ゲームオブジェクトのx座標成分に大きさを変えよ!
解答例
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test3 : MonoBehaviour { Transform v; void Start() { v = this.gameObject.GetComponent<Transform>(); Debug.Log(v); } // Update is called once per frame void Update() { Vector3 s = v.localScale; s.x += 0.01f; v.localScale = s; } }
Unityでのシーン間のデータの受け渡し方法6選
Unityで複数のシーン間でデータの受け渡しをする方法を調べました。
- staticな変数に保持しておく
- シングルトンを利用
- (非推奨)DontDestroyOnLoadを利用
- マルチシーンを利用
- ScriptableObjectを利用
- ストレージに値を保存
- おすすめ書籍
staticな変数に保持しておく
staticな変数に保存するのが、一番単純な方法です。シーンを跨いでも消えることはなく利用できます。
例
public static int count = 0;
シングルトンを利用
staticな領域に値を保存する発展系として、シングルトンパターンを適用したクラスにデータを保存しておく方法もあります。
シングルトンとは、全体を通してインスタンスが一つになる性質がある物のことをさします。
シングルトンパターンの例
using System; public sealed class ExClass { private static ExClass c = new ExClass(); private ExClass() // privateのコンストラクタ { } public static ExClass GetInstance() { return c; } }
この場合は、MonoBehaiviorではなく、System.Objectを継承してクラスを実装
(非推奨)DontDestroyOnLoadを利用
MonoBehavioutのクラス内で利用できるDontDestroyOnLoad関数の引数にゲームオブジェクトのインスタンスを指定すると、そのゲームオボジェクトは明示的にDestroy関数を利用しない限りは削除されなくなる。
これにより、シーンの切替に関係なく、常に存在するゲームオブジェクトのコンポーネントにデータを保持しておくことができる。
ただしこの方法は2021年現在、既に非推奨らしいです。
マルチシーンを利用
複数シーン編集によって、複数のシーンを同時にエディター上で開くことが可能になり、実行時でも簡単に複数シーンを管理できるようになりました。
これにより、破棄しないデータ保存用のシーンとコンポーネントを王位できるようになります。
DontDestroyOnLoadよりもより細かく独自の制御が可能ですが、管理や仕組みを構築するの難易度高め。
こちらを参考:
複数シーンの編集 - Unity マニュアル
ScriptableObjectを利用
DontDestroyOnLoad関数が非推奨なので公式では、こちらの方法を推しているようです。
構造としてはシングルトンパターンをよりスマートにしてUnityにフィットさせたような感じです。
チュートリアルは以下から
ストレージに値を保存
一旦、データをUnity外のファイルやデータベースなどに保存しておく方法です。ハイスコアやシステム設定など、端末に保存すべき簡単なデータであればこの方法が良いとのこと。
【コードが織りなす複雑系な世界】UnityのコーディングとWebのコーディングの違い
こんにちは、のすけです。
Unity(ユニティ)デビューして2ヶ月くらい。
作った物は2つくらいですが。
だんだんWebのコーディングとUnityコーディング(ゲームコーディング)の違いが分かってきたのでメモ
- Unityとは?
- HTML的なコードはない!
- そこに表示されているのは全部GameObject!!
- メッシュという三角形の集合体
- マテリアルはCSSっぽい
- コーディングは生態系??
- UnityでもWebで出力できる
- Webでできる、その他もろもろはできるのかな?
- ゲームエンジンなのでPS4でも実行できるらしい
- 終わりに: ゲームエンジンってつまり現実世界の物理シミュレーションってことは・・・
HTML的なコードはない!
Unityは全て、GUI(グラフィカルユーザインタフェース)で作っていく。
ゆえに、使うのはキーボードというよりかは[マウス]や[トラックパッド]。
なので、全体の構成を記述するHTML的な物はなく
[Sceneビュー]と呼ばれる3D空間ないしは2D空間上に配置される。
だから、このキャラクターも、Sceneビュー上にマウスで配置した。
ただ、x,y,zの絶対座標はあるので、キーボード入力で位置を微調整できる。
HTMLを積み上げ的に書くのではなく
position:absoluteを使いまくって実装していた人は
Unityでも近い感覚で作ることができる。(relative的な相対座標はおそらく無いっぽい)
そこに表示されているのは全部GameObject!!
[Sceneビュー]上に表示されている物は全て[GameObject]という型で定義されている。
Webでいうならば全てDivみたいな感じだ。(DOMと言ってもいいかもしれない)
だから、、、
キャラクターもGameObject
四角い箱もGameObject
地面もGameObject
光源(太陽的な)もGameObject
さらには、我々が見ている、この世界を覗き込む[カメラ]ですらGameObject
GameObjectには[座標と大きさ]などだけがある。
そこに様々な機能をAddComponet(コンポーネントを追加)していくことで、あらゆるものに変身できる
この箱は、ただのGameObjectに
[箱型のメッシュ]と[箱型のメッシュレンダラー]、そして[箱型のマテリアル]の3つを付与することで表現できる。
コンポーネントを切り替えることで、箱にも球体にも、ボタンにも、光にもなれる。
メッシュという三角形の集合体
あらゆるGameObjectにはメッシュやマテリアルを設定できる。
メッシュとは言わば装飾だ。
メッシュがあるから、僕らはそこに物があると認識できる。
厳密にいうとメッシュとは三角形(ポリゴン)の集合体だ。
例えば、この箱は六面体だが、1つの面に対して2つの三角形(ポリゴン)を使っている。
だから、三角形の数(ポリゴン数)は面の2倍なので12個だ。
マテリアルはCSSっぽい
Webの世界でボタンに色をつけたりするときCSSを使うと思う。
画像を貼り付けるときは、backgroud-colorなんかを使うよね。
じゃあUnityはどうするのか?
答え:マテリアルを使う
マテリアルとは質感を表現するモノだ。
メッシュ(ポリゴンの集合体)に色を塗りたくるか、画像を貼り付けることができる。
こんな感じで、マテリアルをただの箱に貼り付けるだけで、様々なオブジェクトに擬態できる。
コーディングは生態系??
ほとんどマウスでできちゃうなら、Unityでコーディング不要では?
いやいや、もちろんある。
Unityのコーディングは基本的には GameObjectに対して行う
重要なのでもう一度言うけれど
Unityのコーディングは基本的には GameObjectに対して行う
のだ。
これはちょっとビックリした。
こんな感じでコードすらGameObjectにAddComponet(コンポーネントを追加)していく。
この画像で言えば[BoxScript]がそれだ。
だから例えば、何かにぶつかった時に消えるとか。大きくなるとか。のコードはその箱のGameObjectに対して行う。
何だかめんどくさそうに思えるけれど。
これはこれでコードがスパゲッティのようにグチャグチャしなくていいと思う。
JavaScriptで言うところのAddEventListenerで全て書いていく感じに近いと思う。
ボタンをクリックしたらevent発動!的なあれだ。
だから、全ての挙動を管理する巨大なコードがあるわけではなく。
複数のGameObjectに紐づくコードが織りなす複雑系な世界がUnityだ。
それは渡り鳥やの飛び方やイワシの群れに似ている。
渡り鳥の群れ全体を管理しているモノはいないが、個々の一羽一羽は独立した機能(法則・ルール・意思)を持っているだけ
でも全体としては意思があるような群れの生態系を描いて、効率的に島から島へと渡っていく。
だから、Unityのゲーム画面は常に生きている。
そこにはルールがあるだけで、精密な管理はない。二度と同じ画面には出会えないのだ。
UnityにおいてはGameObjectに如何に美しい(法則・ルール・意思)を持たせるかがコーダーの腕の見せ所だと思う。
Webはどちらかと言うと全体管理を徹底しているため、この点の思想が全然違うと思う。
ちなみにコードは全てC#という言語で書いていく。
所詮はデビュー2ヶ月の妄想かもしれないけれど、Web歴は相当長いのでこの点が感動ポイントだった。
UnityでもWebで出力できる
こんがらがって来るんだけど、実は
この複雑系な生態系であるUnityはWeb上でも表現できる。
こんな感じでブラウザ(Safari)で実行してみた。
しかも、WebAssembly(ウェブアセンブリ)というブラウザからアセンブリ(機械語)を実行できるようにする最新技術でコンパイルされるらしい!?から、実行速度も結構早い。
全部Javascriptで作るよりUnity使っちゃえ!とも言えるかな。
Webでできる、その他もろもろはできるのかな?
もちろんサーバーと通信できるし
- 内部ブラウザでWeb画面を表示
- 画像表示
- 音声再生
- 動画再生
- データベース接続
なんかもできるのでWebでできることは大体全部できる。
UnityのVisual Studio Codeセッティングメモ
こんにちは、のすけです。
Unityねたです。
前置き
今まで、nuxt.jsにtyrano scriptを入れてハイブリッドwebシナリオゲーム開発なんかやっていました。
↓↓↓
2039アナ民キャンパス
が、そろそろwebの表現力に限界を感じており、スマホアプリへ全てシフトするべく、勉強をはじめている今日この頃です。
Three.jsやbabylon.jsなんかも触り、webでもいろいろ出来て良いのですが、やはり「ゲームの民主化」を図ったUnityは素晴らしく
もうその恩恵に授かろうといういう気持ちです。
次はなんだかんだUnityは避けてきたんですが、もう避けきれなくなってきたので、潔くドップリつかります。
巷では、ゲーム以外のアプリ開発の事例はあんまり出てこないUnityですが、もう切り開いていくしかないですね。
取り急ぎ、Firebase接続してwebっぽく使えるように整備中です。
ただ、なにぶんゲーム開発が素人なもので、フォルダ構成やら構造造りから手探り状態です。
長くなってしまいましたが、今回のメモはUnityでのコーディングの味方
Vsual Studio Codeのセッティングメモです!!
必須設定
素のままいじっていて、全然インテリセンス効かなくて辛いな〜と思っていたので調べました。
まず、Unity側の設定として
Visual Studio Code Editorというのをインストールされている必要があるようです
上のバーの[Asset]-[Package Manager]にあります
次に上のバーの[Unity]か[File]あたりにある[Preferences]を開いて
ExternalToolsのExternal Script Editorの設定をVisual Studio Codeにします
これで、UnityからC#プログラムを開いた時のエディターがVSCodeになります。
続いてインテリセンスを効かせるためには2つツールをPCにインストールします
- Monoインストール
https://www.mono-project.com/download/stable/
- .NET SDK core
https://dotnet.microsoft.com/download
これで最低限、PCとUnityがわの設定は終わりです
続いて、Visual Studio Codeをカスタマイズしていきます
おすすめ設定
Visual Studio Codeはとても便利で、公式・非公式のプラグインを入れることで
どんどんパワーアップしていきます。
ここでは、おすすめのプラグインを紹介します。
使いやすいエディターにカスタマイズしていきましょう!!
- Code Spell Checker
英語のスペルミスを修正してくれる。これでいいんだ!という自作ワードも辞書に追加できる
- Debugger for Unity
Unityをデバッグするやつ
- Japanese Language Pack
日本語化するやつ
- Unity Code Snippets
Unityのスニペットを一撃で入れるやつ
- Unity Tools
Unityのツールらしい。
- Vscode-icons
アイコンを表示してくれて見やすい!!
- Bracket Pair Colorizer
ネストされた記述をわかりやすく色分け
- zenkaku
全角文字をわかりやすく表示。半角と全角間違いを防ぐ。
これらをインストールして設定!!
最後にOmniSharpe設定
Visual Studio CodeのSettingから
Monoと検索して
「Omnisharp: Use Global Mono」
の設定をautoからalwaysに変更します
そして出てくる
Restart OmniSharpをクリック!!!
そうすると......
こんな感じでコード補完(インテリセンス)してくれます!!
「G」と入れただけでGameObjectがサジェストされまする。
まことに気持ちいい。
これでUnityライフが捗りそうです。
JetBrainのRaider買おうか悩んでましたが、VSCodeで良さそうです。
終わりに
これからUnity猛勉しつつ、ここにメモっていきます。
それでは。
Nuxt.js をPM2でデーモン化しながら起動する方法 最新版
Nuxt.js2系にリプレースして、PM2での起動方法が変わったため
紹介しておきます。
PM2のインストール
$ npm install pm2 -g
次にecosystem.config.jsに以下のように記述
module.exports = { apps: [ { name: 'NuxtAppName', exec_mode: 'cluster', instances: 'max', // Or a number of instances script: './node_modules/nuxt/bin/nuxt.js', args: 'start' } ] }
ここのscriptを呼び出す部分がキモですね
script: './node_modules/nuxt/bin/nuxt.js',
そしてビルド開始
npm run build
ecosystem.config.jsを読みながらデーモン化したサーバー起動
pm2 start
起動している事を確認
pm2 ls
ログを確認
pm2 logs
以上!