- 投稿日:2020-02-26T20:04:55+09:00
Unity で unitychan をプログラム無しで動かす (Unity 2019.3.2f1)
やること
Unity でキーボードとマウスでユニティちゃん (unitychan) をプログラムをまったく書かずに動かせるようにします。
参考1:
- https://qiita.com/uneri/items/9dd5123eac8ef7ec8082
- https://miyagame.net/unity-chan-move/最初、上記あたりのページの通りにやろうとしたところ、環境が微妙にことなるせいなのか、同じ選択肢が出てこなかったり、同じ操作をしても同じ結果にならなかったりといろいろ問題が起こったので、別の方法でやってみました。というか、ほぼデフォルト+下記URLの通りなんですが、バージョンの違いのせいなのかデフォルト状態が違うようなので、いろいろ情報を補足してみました。
用意
- Windows 10 Home のインストールされているPC
- Unity 2019.3.2f1
- Unitychan Model 1.2.1
Unity Hub は 2.1.2 を使用してます(多分 Hub の使用の有無やバージョンは動作に関係ないです)。
手順
プロジェクトの作成と Asset のインポート
Unityで3D の新規プロジェクトを作成します。プロジェクト名は何でもよいです。
Unity が起動したら、Window → Asset Store を開きます。
Asset Store を開くと、Unity Asset Store と上部に書かれた画面がでます。Storeに表示される画像や表示は、下記と多少異なっているかもしれません。ちなみにネットがつながっていないと開けません。
虫眼鏡のアイコンをクリックすると、キーボードからキーワードを入力できるようになります。そこで Unitychan と入力します。
すると、たぶん Unitychan という候補が表示されるので、それを選択します。選択すると、Unitychan 関連のいろいろなAssetが表示されます。これらの中から、"Unity-chan!" Model というアセットを探してクリックします。
クリックすると、下記のような表示になります(Unitychan のイラストは違っているかもしれません)。
下のほうにスクロールしていくと、Download というボタンがあるので、それを押します。
ボタンを押すと、場合によっては Unity にログインするためのウィンドウが出ることがあります。もしウィンドウが出たら、アカウントとパスワードを入力して、再び Download のボタンを押します。
ダウロードが完了すると Import もしくは「インポート」という表記に変わるので、そのボタンを押します。
このようなウィンドウが表示されるので、右下の Import のボタンを押します。インポートの処理は、PCの処理能力によってはかなり時間がかかることがあります。
インポートが完了すると、Unity のウィンドウの下にある Project というパネルの中の Assets の中に Unity-chan! というフォルダができます。これでインポートは完了です。
Unitychan モデルの配置
最初に、中央のパネルで Scene タブが選びます。
選ばれていれば、上のような地平線と太陽、カメラみたいなマークが見えている画面になっているはずです。
Unitychan を配置する前に、モデルを置く平面を作成します。これを作成しないと、Unitychan を動かそうとした瞬間、Unitychan が奈落の底に落ちていくことになります…
GameObject → 3D Object → Plane と選びます。
この操作で、平らな地面みたいなものが追加されます。これで平面の追加は終了です。
次に Unitychan を配置します。
Unity の下側にあるパネルの Assets から順番に階層をだどって、Assets → unity-chan → Unity-chan! Model → Prefabs → for Locomotion と選んでいきます。すると、右側に unitychan.prefab と書かれたアイコンが出てきます。この unitychan.prefab は他の場所にもいくつかあって、配置する unitychan.prefab を間違うとうまく操作できなかったりします。
このアイコンをドラッグドロップで、平面が置かれた Scene の中に持っていきます。
すると、上のように Unitychan のモデルが表示されるので、これをマウスでドラッグして中央あたりまでもっていきます。Unitychan を置いたら、Unitychan をクリックして選択状態(青い枠みたいなものが付いた状態)にします。
すると、右側の Inspector というパネルが表示されて、一番上に unitychan と表示されているはずです。
これが表示されている状態にします。
ここまでで、モデルの配置は終了です。次に unitychan を操作できるようにします。
Unitychan をキーボードとマウスで操作できるようにする。
Inspector の Tag のメニューから、Player を選びます。
下のほうにある Animator にチェックが入ってることを確認します。入っていなければ、チェックを入れます。Animator タブの中にある、Controller の項目の右端にある的みたいなマークを押します。すると、下のようにいくつかの Controller が Assets の中から選べるのでここで UnitychanLocomotions を選びます。これも、最初から選ばれていれば、そのままで問題ありません。この設定が正常にされていないと、Uintyちゃんがキー操作で動いてくれません。
Inspector を下のほうにスクロールしていき、Capsule Colider と Rigidbody にチェックが入っていることを確認します。チェックがはいっていなければ、チェックを入れます。
Capsule Colider について X, Y, Z, Radius, Height の数値が上のようになっていることを確認します。これらは、Unitychan が他の物体(平面)とぶつかったときに、Unitychan
が他の物体をすり抜けてしまわないようにするための設定です。Capsule Coliderにチェックが入っていないと、Unitychan を動かした瞬間、平面をすり抜けて奈落の底に落ちていきます。Rigidbody については、Constraints の中の Freeze Rotation の x, y, z にチェックが入っていることを確認します。これは、Unitychan がそれぞれの軸に対して傾くことを禁止する設定です。この設定をしていないと、Unitychan が歩くたびに、だんだんと Unitychan が傾いてしまったり、転倒してしまったりします。
Inspector をさらに下に進んで、Unity Chan Control Script という項目にチェックが入っていることを確認します。チェックされていなければチェックを入れます。この設定がされていないと、Unitychan が動いてくれません。
もし、この項目が存在しない場合は、さらに下のほうにある Add Component というボタンを押します。Add Component ボタンを押すと、キーボードから文字を入力して検索できるようになるので、ここに Unity と打ち込みます。
すると、このように Unity Chan Control Script With Rigid Body という項目が出てくるので、これを選びます。あくまで、この操作は Inspector の中に Unity Chan Control Script というタブが存在しないときだけ行います。もし、タブがすでに存在するのに Add Component すると、下の図のように Unity Chan Control Script というタブが二つできてしまうことがあります。
こうなってしまったら、タブの右端にある点線アイコンを押してメニューを出し、Remove Component を選びます。これで重複したタブを削除できます。
操作してみる
設定がうまくいっていれば、画面上部にあるプレイボタンを押すことで、Unitychan を操作できるようになります。
キー操作は画面に書いてある通りです。 W,A,S,D でも操作できます。
Unitychan が平面端から落ちてしまったら、再生ボタンを押しなおすことでリセットできます。
カメラを Unitychan に追従させる
ここまででも動かすことはできていますが、Unitychan を固定されたカメラから見ている視点になっていて、直感的な操作がしにくいです。そこで、自分の視点がUnitychanのを後ろから追随する、いわゆる第三者視点(Third Person View)になるようにします。
カメラを第三者視点化する
画面左側にある Hierarchy パネルの中にある Main Camera という項目を選びます。Inspector のタブに Main Camera と表示されていれば、カメラの選択に成功しています。
Main Camera を選んだ状態で、Inspector を下のほうにスクロールしていくと、Add Component ボタンがあるので、これを押します。
キー入力で検索できるようになるので、ここに Third と入力します。すると、Third Person Camera という項目が選べるようになるので、これを選びます。
選ぶと、Third Person Camera という項目が Inspector 内に追加されます。
これでカメラの追従設定は終了です。再生ボタンを押すと、Unitychanの背後の視点から操作ができるようになっているはずです。
左側のControlキーを押すか、マウスの左クリックでUnityちゃんを前から見ることもできます。
画面内にあるメニュー(ボタン)を押すことで、Unityちゃんの表情を変えることもできます。
カメラの位置調整
正面のカメラがデフォルトでは少し遠い気がするので、近づけてみます。左側にある Hierarchy パネルから unitychan の左にある三角形を押して、下の階層の項目を表示させます。この中から FrontPos という項目を選びます。
Inspector に FrontPos (Unityちゃんの正面カメラの位置)の情報が表示されるので、ここの Z の項目の数字を下げます。デフォルトでは 2.6くらいになっているのを、1~1.5くらいにするとよい感じがします。
数字を変更すると、Scene ウィンドウの中にカメラの位置が x,y,z 軸の矢印で表示されるので、それを見ながらよさそうな位置に移動させます。設定できたら再生してみます。
数値を調整すれば、もっとアップにすることもできます。
トラブルシューティング
うまくいかない場合は、下記をチェックしてみてください。ひとつでも違うと、同じ操作をしても同じ結果にならないかもしれません。
- Windows 10 Home 以外(macとかLinuxとか)でやっている
- Unity のバージョンが違う。特にVRChat関係を触っていると、古いバージョンのUnityを使っていることがあり、同じ結果にならなかったりします。
- Unitychan Model を Asset Store ではないところから入手して import している。(これが非常によくあるぽい)
- Unitychan Model のバージョンが 1.2.1 ではない。これは、Asset Store でインポートするときに、Store のページで確認するしかないぽい?
- Unitychan を画面内に追加するときに、Assets → unity-chan → Prefabs → for Locomotion 以外の場所から追加している。
- 配置した Unitychan の Inspector の項目の中身が、ここまでの説明の通りになっていない部分がある。
ちなみに、Asset Store 上でバージョン表記が 1.2.1 になっている Unitychan Model をインポートしたときでも、Assets の中にある Documentation → Readme の ReadMe_jp の中のバージョン表記は 1.1.1 になっています(2020/2/26現在)。
- 投稿日:2020-02-26T19:27:40+09:00
Unityのスクリプトテンプレートのカスタマイズとオバーライド
スクリプトテンプレートをカスタマイズしたい!
下記はUnityでスクリプトを生成すると出力されるものです。
暫く使っていると自分好みのテンプレートにカスタマイズしたいと思いませんか?using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }カスタマイズ方法は2通り
- Unity Editorがインストールされたディレクトリ内のScriptTemplatesを修正する
- Assets/ScriptTemplatesを設置する
1は良い記事を見つけたのでこちらの記事をご覧下さい。
今回は2の説明です。1との違いはインストールディレクトリを触らないので気軽に使えます。プロジェクトによって変更することもできるので汎用性が高いです。2. Assets/ScriptTemplatesを設置する
1. Assets/ScriptTemplatesディレクトリを作成
2. 下記テキストを 81-C# Script-NewBehaviourScript.cs.txt という名前で上記ディレクトリに設置
3. 自分好みに修正 [注意] #SCRIPTNAME#は変更しない
4. エディタを再起動using System.Collections; using System.Collections.Generic; using UnityEngine; public class #SCRIPTNAME# : MonoBehaviour { // Start is called before the first frame update void Start() { #NOTRIM# } // Update is called once per frame void Update() { #NOTRIM# } }最後に
ちなみに僕は下記のようにカスタマイズしました。
IL2CPPで出力するiOS/Androidアプリなどはできる限りsealed class
にすると良いですよ。[追記]
新しいコンパイラの影響でCppコードの内容が変わりsealedをつけても直接メソッドを呼んでくれなくなったぽいです。今後どうなるか分からないのでとりあえず引き続きsealed
はつけようと思います。[il2cpp] Is
sealed
Not Worked As Said Anymore In Unity 2018.3?using UnityEngine; public sealed class #SCRIPTNAME# : MonoBehaviour { }
- 投稿日:2020-02-26T19:27:40+09:00
Unityのスクリプトテンプレートのカスタマイズとオーバーライド
スクリプトテンプレートをカスタマイズしたい!
下記はUnityでスクリプトを生成すると出力されるものです。
暫く使っていると自分好みのテンプレートにカスタマイズしたくなりませんか?using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }カスタマイズ方法は2通り
- Unity Editorがインストールされたディレクトリ内のScriptTemplatesを修正する
- Assets/ScriptTemplatesを設置する
1は良い記事を見つけたのでこちらの記事をご覧下さい。
今回は2の説明です。1との違いはインストールディレクトリを触らないので気軽に使えます。プロジェクトによって変更することもできるので汎用性が高いです。2. Assets/ScriptTemplatesを設置する
1. Assets/ScriptTemplatesディレクトリを作成
2. 下記テキストを 81-C# Script-NewBehaviourScript.cs.txt という名前で上記ディレクトリに設置
3. 自分好みに修正 [注意] #SCRIPTNAME#は変更しない
4. エディタを再起動using System.Collections; using System.Collections.Generic; using UnityEngine; public class #SCRIPTNAME# : MonoBehaviour { // Start is called before the first frame update void Start() { #NOTRIM# } // Update is called once per frame void Update() { #NOTRIM# } }最後に
ちなみに僕は下記のようにカスタマイズしました。
IL2CPPで出力するiOS/Androidアプリなどはできる限りsealed class
にすると良いですよ。[追記]
新しいコンパイラの影響でCppコードの内容が変わりsealedをつけても直接メソッドを呼んでくれなくなったぽいです。今後どうなるか分からないのでとりあえず引き続きsealed
はつけようと思います。[il2cpp] Is
sealed
Not Worked As Said Anymore In Unity 2018.3?using UnityEngine; public sealed class #SCRIPTNAME# : MonoBehaviour { }
- 投稿日:2020-02-26T14:46:14+09:00
UnityCollabrateで招待できてもプロジェクトがダウンロードできなかった場合
Unity Collabrateで共同制作者とプロジェクトファイルを共有した際に詰まったので共有します。
(プロジェクトファイルをUnity Collabrateで使用するためにはこちらを参考にしました
https://qiita.com/warapuri/items/bfb2a7cdbbcebaa172cc)共同制作者にプロジェクトファイルの存在は伝わっているものの、ダウンロードができない状態でした。
結論、チームに招待すると解決しました。https://id.unity.com/ja/account/edit
上記のURLからUnityIDページに飛び、左側の「組織」を選択します。
自分が作成したプロジェクトを開きます。
「メンバー&グループ」をクリックします。
すると、右側に「メンバーを追加」があるのでクリック
メンバーのメールアドレスと組織の担当を割り当てて招待メールを送ります。
(ちなみに組織の役割ですがこちらを参考にしてください。
https://helpdesk.unity3d.co.jp/hc/ja/articles/115002023468-Unity-%E3%81%AE%E7%B5%84%E7%B9%94%E3%81%A7-%E3%82%AA%E3%83%BC%E3%83%8A%E3%83%BC-%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AF%E4%BD%95%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-%E3%81%A9%E3%82%93%E3%81%AA%E7%AE%A1%E7%90%86%E6%A8%A9%E9%99%90%E3%82%92%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B-)
- 投稿日:2020-02-26T13:06:27+09:00
『Unity C# 個人用メモ』 オブジェクトをクリックした座標へ移動させる(ナビゲーション不使用
クリックした位置の座標を取得し移動させる
Ray
とRaycastHit
を使用してオブジェクトをクリックした座標へ移動させる
Rayをちゃんと理解してないから推測込み('ω')難しいのよね前提として
プレイ画面(スクリーン座標)は2Dなのでそれをゲーム上の3D空間(ワールド座標)へ変換する必要がある
素材
public class NewBehaviourScript : MonoBehaviour { //レイを使用するための宣言 private Ray ray; //レイがヒットした情報を格納するために使う private RaycastHit hit; //移動先の座標格納用 private Vector3 pos; //移動用 private float step;本文
void Update() { //クリックされた時 if (Input.GetMouseButtonDown(0)) { //レイのスタート位置 ray = Camera.main.ScreenPointToRay(Input.mousePosition); //レイキャスト(スタート位置,方向 情報,距離) if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { //座標posへhitを変換 pos = hit.point; pos.y = 1f; } //移動用 step = 10f * Time.deltaTime; } //オブジェクトの移動 transform.position = Vector3.MoveTowards(transform.position, pos, step); } }ray
そもそも
ray
(レイ)ってなんぞやっていう疑問
特定の位置からセンサーを飛ばすって意味と推測してるけど実際どうなんだろう?ray = Camera.main.ScreenPointToRay(Input.mousePosition);
ray
を飛ばすスタート地点を宣言
Camera.main.ScreenPointToRay()
プレイ画面上のどこから飛ばすかを設定する
今回はマウスがクリックされた時のマウスの位置を取得しなければならないので
スタート地点はInput.mousePosition
となるRaycast
if (Physics.Raycast(ray, out hit, Mathf.Infinity)) ///Physics.Raycast(スタート地点, レイと飛ばす方向 レイが当たったオブジェクトの情報を格納, レイを飛ばす距離)※
Physics.Raycast()
はRaycastHitを使う際の決まり文句※
ray
はレイを飛ばすスタート地点のこと※
out
はどの方向にレイを飛ばすかということ
・補足:今回はout
なのでカメラの目線からout(奥側)となる(決まり文句でいいのかなと思う)※
hit
はレイキャストで飛ばしたレイが接触したオブジェクトの情報の格納先のこと
・補足:今回は変数hit
に座標とか名前とか色々な情報が格納される※
Mathf.Infinity
は飛ばすレイの最大距離のこと{最大射程とか言った方が分かりやすい?}
・補足1:レイの飛ばす距離はfloat型
であり、100f等とすれば範囲を制限できる
(途方もなく遠い場所にあるオブジェクトに反応しないようにするため)
・補足2:逆に別に範囲を制限しないのであればMathf.Infinity
と書けば距離は無限大になるその後
pos = hit.point; pos.y = 1f;
Vector3 pos
へhit.point
(hitの場所つまり座標)を変換して格納する
なおy軸
は動いてほしくないのでオブジェクトの初期の設定値を入れるstep = 10f * Time.deltaTime;これは移動速度の値10fに
Time.deltaTime
を与えることでマシンスペックに関係なく処理速度を一定にするVector3.MoveTowards()
transform.position = Vector3.MoveTowards(transform.position, pos, step); ///transform.position = Vector3.MoveTowards(対象, 移動先, 速度);
Vector3.MoveTowards()
で対象を移動先まで移動させることが出来る
今回は本体
をクリックされた座標
へ設定された速度
で移動させる。となる
- 投稿日:2020-02-26T11:34:11+09:00
[Unity]音楽が再生されない
- 投稿日:2020-02-26T09:35:40+09:00
Unity コマンドライン引数
アプリケーションの二重起動を防ぐ
$ test.exe -single-instanceフレームなしのポップアップウィンドウで起動
$ test.exe -popupwindow$ test.app/Contents/MacOS/test -popupwindowフルスクリーン
フルスクリーンで起動
$ test.exe -screen-fullscreen 1$ test.app/Contents/MacOS/test -screen-fullscreen 1※以後、デフォルトでフルスクリーンで起動する
ウィンドウモードで起動
フレームなしのポップアップウィンドウで起動
$ test.exe -screen-fullscreen 0$ test.app/Contents/MacOS/test -screen-fullscreen 0※以後、デフォルトでウィンドウモードで起動する
ディスプレイを指定して起動
ディスプレイ1で起動
$ test.exe -adapter 0$ test.app/Contents/MacOS/test -adapter 0ディスプレイ2で起動
$ test.exe -adapter 1$ test.app/Contents/MacOS/test -adapter 1ウィンドウサイズの指定
1920x1080で起動
$ test.exe -screen-width 1920 -screen-height 1080$ test.app/Contents/MacOS/test -screen-width 1920 -screen-height 1080800x600で起動
$ test.exe -screen-width 800 -screen-height 600$ test.app/Contents/MacOS/test -screen-width 800 -screen-height 600※以後、デフォルトで指定した解像度で起動する
- 投稿日:2020-02-26T09:35:40+09:00
Unityのコマンドラインオプション
Unityでビルドしたアプリケーションはターミナルやコマンドプロンプトで起動時に引数を渡して起動できる。
https://docs.unity3d.com/ja/2018.4/Manual/CommandLineArguments.html以下公式で提供されているよく使うコマンドラインオプション
アプリケーションの二重起動を防ぐ
$ test.exe -single-instanceフレームなしのポップアップウィンドウで起動
$ test.exe -popupwindow$ test.app/Contents/MacOS/test -popupwindowフルスクリーン
フルスクリーンで起動
$ test.exe -screen-fullscreen 1$ test.app/Contents/MacOS/test -screen-fullscreen 1※以後、デフォルトでフルスクリーンで起動する
ウィンドウモードで起動
$ test.exe -screen-fullscreen 0$ test.app/Contents/MacOS/test -screen-fullscreen 0※以後、デフォルトでウィンドウモードで起動する
ディスプレイを指定して起動
ディスプレイ1で起動
$ test.exe -adapter 0$ test.app/Contents/MacOS/test -adapter 0ディスプレイ2で起動
$ test.exe -adapter 1$ test.app/Contents/MacOS/test -adapter 1ウィンドウサイズの指定
1920x1080で起動
$ test.exe -screen-width 1920 -screen-height 1080$ test.app/Contents/MacOS/test -screen-width 1920 -screen-height 1080800x600で起動
$ test.exe -screen-width 800 -screen-height 600$ test.app/Contents/MacOS/test -screen-width 800 -screen-height 600※以後、デフォルトで指定した解像度で起動する
- 投稿日:2020-02-26T09:09:47+09:00
C#の演習問題:しまづ君にプログラミングを教えよう!【Unityゲームスタジオ スタジオしまづ】
(ベータ版)
これはあなた自身の物語です
ときは戦国、、、
ゲーム開発をするためにプログラミングを学び始めたしまづ君(永遠の3才)。
ところが彼はまだまだプログラミングのことがわかっていません。
のちに世界を救うこととなる「スタジオしまづ」設立のために彼にプログラミングを教えましょう!演習問題を行う前の準備:準備中
演習問題1:変数の宣言方法がわかっている?
しまづくん:コードを書いていたらこんなエラーが出てしまったよ。。。
どうすればいいかな?
しまづ君のコード
Question.csusing UnityEngine; public class Question : MonoBehaviour { myStadio = "スタジオしまづ"; void Start() { Debug.Log(myStadio); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { string myStadio = "スタジオしまづ"; void Start() { Debug.Log(myStadio); } }演習問題2:変数の種類(データ型)がわかっているか
しまづくん:僕のプロフィールをUnityさんに教えようとしたら、こんなエラーが出てしまったよ。。。
どうすればいいかな?
Question.csusing UnityEngine; public class Question : MonoBehaviour { // 名前:スタジオしまづ // 身長:163.0cm // 体重:44.5kg // 誕生日:5月7日 bool myName = "スタジオしまづ"; float height = 45.5; int weight = 45.5; string monthOfbirth = 5; Vector3 dayOfbirth = 7; void Start() { Debug.Log("名前:" + myName); Debug.Log("身長:" + height); Debug.Log("体重:" + weight); Debug.Log("誕生日:" + monthOfbirth+"月"+ dayOfbirth + "日"); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { // 名前:スタジオしまづ // 身長:163.0cm // 体重:44.5kg // 誕生日:5月7日 string myName = "スタジオしまづ"; float height = 45.5f; float weight = 45.5f; int monthOfbirth = 5; int dayOfbirth = 7; void Start() { Debug.Log("名前:" + myName); Debug.Log("身長:" + height); Debug.Log("体重:" + weight); Debug.Log("誕生日:" + monthOfbirth+"月"+ dayOfbirth + "日"); } }
- 投稿日:2020-02-26T09:09:47+09:00
C#&Unityの演習問題:しまづ君にプログラミングを教えよう!【スタジオしまづアカデミー】
(ベータ版:いいねと思ったらtwitterに投稿してもらえると嬉しいです^^)
(おすすめの問題があれば、編集リクエストで追加していただけると助かります)これはあなた自身の物語です
ときは戦国、、、
ゲーム開発をするためにプログラミングを学び始めたしまづ君(永遠の3才)。
ところが彼はまだまだプログラミングのことがわかっていません。
のちに世界を救うこととなる「スタジオしまづ」設立のために彼にプログラミングを教えましょう!演習問題を行う前の準備:準備中
演習問題1:変数の宣言方法がわかっている?
しまづくん:コードを書いていたらこんなエラーが出てしまったよ。。。
どうすればいいかな?
しまづ君のコード
Question.csusing UnityEngine; public class Question : MonoBehaviour { myStadio = "スタジオしまづ"; void Start() { Debug.Log(myStadio); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { string myStadio = "スタジオしまづ"; void Start() { Debug.Log(myStadio); } }しまづ君:ありがとう!変数の宣言方法がわかったよ^^
演習問題2:変数の種類(データ型)がわかっているか
しまづくん:僕のプロフィールをUnityさんに教えようとしたら、こんなエラーが出てしまったよ。。。
どうすればいいかな?
Question.csusing UnityEngine; public class Question : MonoBehaviour { // 名前:スタジオしまづ // 身長:163.0cm // 体重:44.5kg // 誕生日:5月7日 bool myName = "スタジオしまづ"; float height = 45.5; int weight = 45.5; string monthOfbirth = 5; Vector3 dayOfbirth = 7; void Start() { Debug.Log("名前:" + myName); Debug.Log("身長:" + height); Debug.Log("体重:" + weight); Debug.Log("誕生日:" + monthOfbirth+"月"+ dayOfbirth + "日"); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { // 名前:スタジオしまづ // 身長:163.0cm // 体重:44.5kg // 誕生日:5月7日 string myName = "スタジオしまづ"; float height = 45.5f; float weight = 45.5f; int monthOfbirth = 5; int dayOfbirth = 7; void Start() { Debug.Log("名前:" + myName); Debug.Log("身長:" + height); Debug.Log("体重:" + weight); Debug.Log("誕生日:" + monthOfbirth+"月"+ dayOfbirth + "日"); } }しまづ君:ありがとう!これで誕生日プレゼントがみんなからたくさんもらえるぞ^^
演習問題3:変数の四則演算子がわかっているか
しまづくん:123かける456割る2を計算してコンソールに表示したいんだけどどうかけばいいかな?
Question.csusing UnityEngine; public class Question : MonoBehaviour { // 123かける456割る2の計算結果をコンソールに表示したい void Start() { } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { // 123かける456割る2の計算結果をコンソールに表示したい void Start() { Debug.Log(123*456/2); // 28044 } }しまづ君:ありがとう!算数も勝手にやってくれるんだね^^
演習問題4:変数の四則演算子がわかっているか
しまづくん:1+2は3でしょ?そこに5をかけると15じゃん!でも11が出るんだけど、、、
どうすれば15になるかなぁ?Question.csusing UnityEngine; public class Question : MonoBehaviour { int x = 1; int y = 2; int z = 5; // 1+2をおこなってから5をかけて、コンソールに15を表示したい void Start() { Debug.Log(x+y*z); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int x = 1; int y = 2; int z = 5; // 1+2をおこなってから5をかけて、コンソールに15を表示したい void Start() { Debug.Log((x+y)*z); } }しまづ君:教えてくれてありがとう!掛け算が先に計算されちゃうんだ^^
演習問題5:変数の四則演算子がわかっているか
しまづくん:食事会の費用19800円を7人で割り勘することになったんだけど、割り切れなかった分はパパが払ってくれるんだ。
1人あたり何円集めて、いくらパパから貰えばいいかな?Question.csusing UnityEngine; public class Question : MonoBehaviour { int x = 19800; int n = 7; // x,y,zを3で割ったあまりをそれぞれ表示したい void Start() { int y = 0; // ここに計算をかく int z = 0; // ここに計算をかく Debug.Log("1人あたりからもらうお金:"+ y); Debug.Log("パパからもらうお金:"+z); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int x = 19800; int n = 7; // x,y,zを3で割ったあまりをそれぞれ表示したい void Start() { int y = x / n; // ここに計算をかく int z = x % n; // ここに計算をかく Debug.Log("1人あたりからもらうお金:"+ y); Debug.Log("パパからもらうお金:"+z); } }しまづ君:教えてくれてありがとう!パパのところに行ってこよ^^
演習問題6:変数の演算子がわかっているか
しまづくん:1つの変数だけで、数字を1づつ増やして表示したいんだけどどうすればいいかな?
できれば++とか+=とかを使いたい(> <)Question.csusing UnityEngine; public class Question : MonoBehaviour { int x = 0; void Start() { // 以下をxのみを使って行いたい(++, += を使ってやってみて) Debug.Log(x); int x1 = x + 1; Debug.Log(x1); int x2 = x1 + 1; Debug.Log(x2); int x3 = x2 + 1; Debug.Log(x3); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int x = 0; void Start() { // 以下をxのみを使って行いたい(++, += を使ってやってみて) Debug.Log(x); x = x + 1; Debug.Log(x); x += 1; Debug.Log(x); x ++; Debug.Log(x); } }しまづ君:教えてくれてありがとう!なんかプログラマになれた気分^^
演習問題7:比較演算子(イコール)がわかっているか
しまづくん:10と2が同じ数字か調べてみたら、2が返ってきたんだよ!!!!
どこが違うと思う?Question.csusing UnityEngine; public class Question : MonoBehaviour { int n = 10; int m = 2; void Start() { Debug.Log(n = m); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int n = 10; int m = 2; void Start() { Debug.Log(n == m); } }しまづ君:教えてくれてありがとう!プログラムの=は数学の=と違うんだね^^
演習問題8:比較演算子(否定)がわかっているか
しまづくん:10と2が違う数字か調べてみたら、エラーが出ちゃった!!!!
どこが違うと思う?Question.csusing UnityEngine; public class Question : MonoBehaviour { int n = 10; int m = 2; void Start() { Debug.Log(n =! m); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int n = 10; int m = 2; void Start() { Debug.Log(n != m); } }しまづ君:教えてくれてありがとう! 「!」の位置に決まりがあるんだね^^
演習問題9:ifがわかっているか
しまづくん:HPが0になったら「戦闘不能」と表示したかったんだけど、ずっと出ちゃってる。。。
どうすればいいかな?Question.csusing UnityEngine; public class Question : MonoBehaviour { int hp = 100; void Start() { if (hp >= 0) { Debug.Log("戦闘不能"); } } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int hp = 100; void Start() { if (hp <= 0) { Debug.Log("戦闘不能"); } } }しまづ君:教えてくれてありがとう! この辺りよくわ違えちゃうかも><
演習問題10:if elseがわかっているか
しまづくん:HPが0になったら「戦闘不能」、それ以外のときは「しまちゅー元気でちゅー」と表示したかったんだけど、ずっと元気なんだw
どうすればいいかな?Question.csusing UnityEngine; public class Question : MonoBehaviour { int hp = 100; void Start() { if (hp <= 0) { Debug.Log("戦闘不能"); } Debug.Log("しまちゅー元気でちゅー"); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int hp = 100; void Start() { if (hp <= 0) { Debug.Log("戦闘不能"); } else { Debug.Log("しまちゅー元気でちゅー"); } } }しまづ君:教えてくれてありがとう! elseを使えばいいんだね
演習問題11:if-elseifがわかっているか
しまづくん:x>0なら「右に動く」、x<0なら「左に動く」、それ以外なら「そのまま」っと表示したいんだけど、「左に動く」と「そのまま」が出ちゃうんだ。。。
どうすればいい?Question.csusing UnityEngine; public class Question : MonoBehaviour { //int x = 1; // x > 0のときのテスト用 //int x = 0; // xが0のときのテスト用 int x = -1; // x < 0のときのテスト用 void Start() { if (x > 0) { Debug.Log("右に動く"); } else { Debug.Log("左に動く"); } Debug.Log("そのまま"); } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { //int x = 1; // x > 0のときのテスト用 //int x = 0; // xが0のときのテスト用 int x = -1; // x < 0のときのテスト用 void Start() { if (x > 0) { Debug.Log("右に動く"); } else if(x < 0) { Debug.Log("左に動く"); } else { Debug.Log("そのまま"); } } }しまづ君:教えてくれてありがとう! else ifを使えば色々分けられるんだ^^
演習問題12:switchがわかっているか
しまづくん:以下のようなプログラムを作ろうとしてるんだけど、、、
・directionが1ならspeedは1.1
・directionが0ならspeedは0
・directionが-1ならspeedは-1.1
ネットで見つけた記事からここまでは書けたんだけど、あとどうすればいいかな?Question.csusing UnityEngine; public class Question : MonoBehaviour { int direction = 1; // direction > 0のときのテスト用 //int direction = 0; // directionが0のときのテスト用 //int direction = -1; // direction < 0のときのテスト用 float speed; void Start() { switch (direction) { case 100: speed = 22f; break; case -10: speed = -22f; break; } } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int direction = 1; // direction > 0のときのテスト用 //int direction = 0; // directionが0のときのテスト用 //int direction = -1; // direction < 0のときのテスト用 float speed; void Start() { switch (direction) { case 1: speed = 1.1f; break; case 0: speed = 0f; break; case -1: speed = 1.1f; break; } } }しまづ君:教えてくれてありがとう! if文でも出来そうだなぁ
演習問題13:whileがわかっているか
しまづくん:10から1000までの数字を表示したいんだけど、なんとか14までは表示出来たんだ!偉いでしょ^^
ネットで調べたらwhileが使えるって書いてあったんだけど、どうすればいいかな?Question.csusing UnityEngine; public class Question : MonoBehaviour { int count = 10; void Start() { Debug.Log(count); count = count + 1; Debug.Log(count); count = count + 1; Debug.Log(count); count = count + 1; Debug.Log(count); count = count + 1; Debug.Log(count); count = count + 1; } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int count = 10; void Start() { while (count <= 1000) { Debug.Log(count); count = count + 1; } } }しまづくん:ありがとう!whileの使い方がわかったよ^^
演習問題14:whileがわかっているか
しまづくん:1000から2000までの数字を表示し続けて、273の倍数があったらそこで処理止めたいってときはどうすればいいかな?
Question.csusing UnityEngine; public class Question : MonoBehaviour { int n = 1000; void Start() { while (n <= 2000) { Debug.Log(n); n++; } } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { int n = 1000; void Start() { while (n <= 2000) { Debug.Log(n); if (n % 273 == 0) { break; } n++; } } }しまづくん:ありがとう!whileとbreakの使い方がわかったよ^^
演習問題15:forがわかっているか
しまづくん:前の問題「10から1000までの数字を表示」はfor文でもできるって聞いたんだけどどうやったら出来るの?
Question.csusing UnityEngine; public class Question : MonoBehaviour { int count = 10; void Start() { while (count <= 1000) { Debug.Log(count); count = count + 1; } } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { void Start() { for (int i=10; i<=1000; i++) { Debug.Log(i); } } }しまづくん:すごーい!for文の使い方がわかったよ^^
演習問題16:forとbreakがわかっているか
しまづくん:前の問題「1000から2000までの数字を表示し続けて、273の倍数があったらそこで処理止めたい」もfor文ならどうなるの?
Question.csusing UnityEngine; public class Question : MonoBehaviour { void Start() { for (int i=10; i<=1000; i++) { Debug.Log(i); } } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { void Start() { for (int i = 1000; i <= 2000; i++) { Debug.Log(i); if ( i%273 == 0) { break; } } } }しまづくん:すごーい!breakの使い方がわかったよ^^
演習問題17:forとcontinueがわかっているか
しまづくん:0から99までの数字を表示したい。だけど、3の倍数は表示したくない場合、for文ならどうかけるの?
continueを使いたいなぁQuestion.csusing UnityEngine; public class Question : MonoBehaviour { void Start() { } }---解答ルパン---
Question.csusing UnityEngine; public class Question : MonoBehaviour { void Start() { for (int i = 0; i < 100; i++) { if ( i%3 == 0) { continue; } Debug.Log(i); } } }しまづくん:すごーい!continueの使い方がわかったよ^^
- 投稿日:2020-02-26T08:51:37+09:00
Unity の新しいInputSystemもAsObservableしたーい!
拡張メソッド作った
using UniRx; public static class UnityInputSystemExtensions { public static IObservable<InputAction.CallbackContext> AsObservable(this InputAction action) { return Observable.FromEvent<InputAction.CallbackContext>( h => action.performed += h, h => action.performed -= h); } }使い方
var MainInput = new MainInput(); // ここは各環境によって違うと思う MainInput.UI.Click.AsObservable().Subscribe(context => Debug.Log("clicked")).AddTo(this);
- 投稿日:2020-02-26T05:21:18+09:00
PlayerPrefsの型を自由に使いたい
PlayerPrefsUtilとは
本来PlayerPrefsはint,float,stringという3つの型しか保存できません。
めんどくさい!自由な型を保存したい!
ということでジェネリックを使い色々な型を保存できるように作ったものがPlayerPrefsUtilです。導入
ダウンロードしたCSファイルをプロジェクトの適当なところに配置するだけです。
使用方法
PlayerPrefsの仕組みに合わせて作ってあるので、Keyの仕組みやset、saveなどの使い方はPlayerPrefsと同じです。
なので、PlayerPrefsと同じような感じで使えば大丈夫です。
ここでは型の指定と気まぐれで追加した圧縮について説明していきます。セーブ :
void SetObj<T>(string key,T obj,bool compression(オプション引数))
セーブするメソッドです。
SetObjではおそらく省略可能ですが、ジェネリックで型を指定します。
引数obj
には保存するインスタンスを入れます。ロード :
T GetObj<T>(string key)
ロードするメソッドです。
ジェネリックで指定した型でデータを返します。使用例として、string nameとint age変数を持つクラス、"Personクラス"のデータをセーブ/ロードする仕組みを作ってみます。
PersonSaveAndLoad.cs//保存するクラス public class Person { //名前と年齢 public string name; public int age; //コンストラクタ public Person(string name , int age) { this.name = name; this.age = age; } } //Unityのクラス public class PersonSaveAndLoad : MonoBehaviour { //セーブする変数 private Person personA; //ロードしたデータを入れる変数 private Person personALoad; void Start() { //データを入力 personA = new Person("Tarou", 20); } void Update() { } //セーブするメソッド public void SavePersonA() { //セーブ PlayerPrefsUtil.SetObj<Person>("PersonAData", personA); } //ロードするメソッド public void LoadPersonA() { personALoad = PlayerPrefsUtil.GetObj<Person>("PersonAData"); } }これで、SavePersonA()を実行すれば、key"PerosnAData"に変数personAのデータが保存され、
LoadPersonA()を実行すれば、key"PersonAData"のデータをロードして、変数personALoadにデータが入ります。圧縮について
今回作ったPlayerPrefsUtilは、XMLSerializerを使ってXML形式にしたものをStringでPlayerPrefsを使いセーブしています。
なので、セーブしたデータは見れば簡単に分かってしまうので、Stringの文字列を圧縮し分かりづらくする仕組みを作りました。
使い方は単純にセーブする時にSetObj(string key,T obj,bool compression)のcompressionにtrueを入れておけばいいだけです。以上です!自分があまり説明などを書いたことがないのであまり説明が上手ではないと思います、なのでわからないところや質問があったらどんどん書いてください。
- 投稿日:2020-02-26T04:17:18+09:00
選択した場所をコメントアウトする方法#Unityゲーム制作01
どうも、わたたかです。
普段はTwitterで活動しているただのゲーマーです。で、ゲーム制作をボチボチしているのでこれから
自分のゲーム制作のアウトプットをしていこうと思います。
まとめはnoteに書こうと思ってるので少し雑になっても完結なアウトプットになればと思ってます。ますます言っててすみません。気をつけます。
本題に入ります
選択した場所をコメントアウトする方法
※Visual studio2017を使用しています。
コメントアウトしたい部分を選択
int a;マウスでもキーボードでも何でもいいです。
crtl+k → crtl+C と押す
//int a;
こうなります。
これを解除するには
crtl+k → crtl+u と押してください。int a;//が外れます。
そこそこ便利なので使ってみましょう。
以上です。
- 投稿日:2020-02-26T04:17:18+09:00
選択した場所をコメントアウトする方法/Unityゲーム制作01
どうも、わたたかです。
普段はTwitterで活動しているただのゲーマーです。で、ゲーム制作をボチボチしているのでこれから
自分のゲーム制作のアウトプットをしていこうと思います。
まとめはnoteに書こうと思ってるので少し雑になっても完結なアウトプットになればと思ってます。ますます言っててすみません。気をつけます。
本題に入ります
選択した場所をコメントアウトする方法
※Visual studio2017を使用しています。
コメントアウトしたい部分を選択
int a;マウスでもキーボードでも何でもいいです。
crtl+k → crtl+C と押す
//int a;
こうなります。
これを解除するには
crtl+k → crtl+u と押してください。int a;//が外れます。
そこそこ便利なので使ってみましょう。
以上です。
- 投稿日:2020-02-26T00:25:42+09:00
PostProcessでカラーパレットの差し替え出来るやつ作った
PostProcessingPaletteSwap
https://github.com/kyubuns/PostProcessingPaletteSwap
出来ること
- PostProcessでカラーパレットを変更できる!
- カラーパレットは最大256色まで対応
- カラーのスプライトを特定ディレクトリに放り込んだら、勝手にカラーパレット対応してくれるエディタスクリプト付き!
カラーパレットのサンプル
- 例えば8色のパレットなら、↑これを8px x 1pxで保存して突っ込めばオッケー!
- サンプルにもパレット入ってるんですけど、github上で見ると小さすぎて見えないのでめっちゃ拡大して見てください
出来ないこと
- PostProcessでやってるので、こっちのキャラだけ色替え!みたいなのは(ちょっと工夫しないと)出来ません。あくまで画面全体が対象です。