20200226のUnityに関する記事は15件です。

Unity で unitychan をプログラム無しで動かす (Unity 2019.3.2f1)

やること

Unity でキーボードとマウスでユニティちゃん (unitychan) をプログラムをまったく書かずに動かせるようにします。

参考1:
- https://qiita.com/uneri/items/9dd5123eac8ef7ec8082
- https://miyagame.net/unity-chan-move/

最初、上記あたりのページの通りにやろうとしたところ、環境が微妙にことなるせいなのか、同じ選択肢が出てこなかったり、同じ操作をしても同じ結果にならなかったりといろいろ問題が起こったので、別の方法でやってみました。というか、ほぼデフォルト+下記URLの通りなんですが、バージョンの違いのせいなのかデフォルト状態が違うようなので、いろいろ情報を補足してみました。

参考2:
http://socialakiba.com/index.php/%E3%83%A6%E3%83%8B%E3%83%86%E3%82%A3%E3%81%A1%E3%82%83%E3%82%93%E3%81%AE%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A

用意

  • Windows 10 Home のインストールされているPC
  • Unity 2019.3.2f1
  • Unitychan Model 1.2.1

Unity Hub は 2.1.2 を使用してます(多分 Hub の使用の有無やバージョンは動作に関係ないです)。

手順

プロジェクトの作成と Asset のインポート

Unityで3D の新規プロジェクトを作成します。プロジェクト名は何でもよいです。

image.png

Unity が起動したら、Window → Asset Store を開きます。

2.jpg

Asset Store を開くと、Unity Asset Store と上部に書かれた画面がでます。Storeに表示される画像や表示は、下記と多少異なっているかもしれません。ちなみにネットがつながっていないと開けません。

3.jpg

虫眼鏡のアイコンをクリックすると、キーボードからキーワードを入力できるようになります。そこで Unitychan と入力します。

image.png

すると、たぶん Unitychan という候補が表示されるので、それを選択します。選択すると、Unitychan 関連のいろいろなAssetが表示されます。これらの中から、"Unity-chan!" Model というアセットを探してクリックします。

4.jpg

クリックすると、下記のような表示になります(Unitychan のイラストは違っているかもしれません)。

5.jpg

下のほうにスクロールしていくと、Download というボタンがあるので、それを押します。

6.jpg

ボタンを押すと、場合によっては Unity にログインするためのウィンドウが出ることがあります。もしウィンドウが出たら、アカウントとパスワードを入力して、再び Download のボタンを押します。

7.jpg

ダウロードが完了すると Import もしくは「インポート」という表記に変わるので、そのボタンを押します。

image.png

このようなウィンドウが表示されるので、右下の Import のボタンを押します。インポートの処理は、PCの処理能力によってはかなり時間がかかることがあります。

image.png

インポートが完了すると、Unity のウィンドウの下にある Project というパネルの中の Assets の中に Unity-chan! というフォルダができます。これでインポートは完了です。

Unitychan モデルの配置

最初に、中央のパネルで Scene タブが選びます。

image.png

選ばれていれば、上のような地平線と太陽、カメラみたいなマークが見えている画面になっているはずです。

Unitychan を配置する前に、モデルを置く平面を作成します。これを作成しないと、Unitychan を動かそうとした瞬間、Unitychan が奈落の底に落ちていくことになります…

image.png

GameObject → 3D Object → Plane と選びます。

image.png

この操作で、平らな地面みたいなものが追加されます。これで平面の追加は終了です。

次に Unitychan を配置します。

image.png

Unity の下側にあるパネルの Assets から順番に階層をだどって、Assets → unity-chan → Unity-chan! Model → Prefabs → for Locomotion と選んでいきます。すると、右側に unitychan.prefab と書かれたアイコンが出てきます。この unitychan.prefab は他の場所にもいくつかあって、配置する unitychan.prefab を間違うとうまく操作できなかったりします。

このアイコンをドラッグドロップで、平面が置かれた Scene の中に持っていきます。

image.png

すると、上のように Unitychan のモデルが表示されるので、これをマウスでドラッグして中央あたりまでもっていきます。Unitychan を置いたら、Unitychan をクリックして選択状態(青い枠みたいなものが付いた状態)にします。

image.png

すると、右側の Inspector というパネルが表示されて、一番上に unitychan と表示されているはずです。

image.png

これが表示されている状態にします。

ここまでで、モデルの配置は終了です。次に unitychan を操作できるようにします。

Unitychan をキーボードとマウスで操作できるようにする。

Inspector の Tag のメニューから、Player を選びます。

image.png

下のほうにある Animator にチェックが入ってることを確認します。入っていなければ、チェックを入れます。Animator タブの中にある、Controller の項目の右端にある的みたいなマークを押します。すると、下のようにいくつかの Controller が Assets の中から選べるのでここで UnitychanLocomotions を選びます。これも、最初から選ばれていれば、そのままで問題ありません。この設定が正常にされていないと、Uintyちゃんがキー操作で動いてくれません。

image.png

Inspector を下のほうにスクロールしていき、Capsule Colider と Rigidbody にチェックが入っていることを確認します。チェックがはいっていなければ、チェックを入れます。

image.png

Capsule Colider について X, Y, Z, Radius, Height の数値が上のようになっていることを確認します。これらは、Unitychan が他の物体(平面)とぶつかったときに、Unitychan
が他の物体をすり抜けてしまわないようにするための設定です。Capsule Coliderにチェックが入っていないと、Unitychan を動かした瞬間、平面をすり抜けて奈落の底に落ちていきます。

image.png

Rigidbody については、Constraints の中の Freeze Rotation の x, y, z にチェックが入っていることを確認します。これは、Unitychan がそれぞれの軸に対して傾くことを禁止する設定です。この設定をしていないと、Unitychan が歩くたびに、だんだんと Unitychan が傾いてしまったり、転倒してしまったりします。

Inspector をさらに下に進んで、Unity Chan Control Script という項目にチェックが入っていることを確認します。チェックされていなければチェックを入れます。この設定がされていないと、Unitychan が動いてくれません。

image.png

もし、この項目が存在しない場合は、さらに下のほうにある Add Component というボタンを押します。Add Component ボタンを押すと、キーボードから文字を入力して検索できるようになるので、ここに Unity と打ち込みます。

image.png

すると、このように Unity Chan Control Script With Rigid Body という項目が出てくるので、これを選びます。あくまで、この操作は Inspector の中に Unity Chan Control Script というタブが存在しないときだけ行います。もし、タブがすでに存在するのに Add Component すると、下の図のように Unity Chan Control Script というタブが二つできてしまうことがあります。

image.png

こうなってしまったら、タブの右端にある点線アイコンを押してメニューを出し、Remove Component を選びます。これで重複したタブを削除できます。

image.png

操作してみる

設定がうまくいっていれば、画面上部にあるプレイボタンを押すことで、Unitychan を操作できるようになります。

image.png

キー操作は画面に書いてある通りです。 W,A,S,D でも操作できます。

image.png

Unitychan が平面端から落ちてしまったら、再生ボタンを押しなおすことでリセットできます。

カメラを Unitychan に追従させる

ここまででも動かすことはできていますが、Unitychan を固定されたカメラから見ている視点になっていて、直感的な操作がしにくいです。そこで、自分の視点がUnitychanのを後ろから追随する、いわゆる第三者視点(Third Person View)になるようにします。

カメラを第三者視点化する

画面左側にある Hierarchy パネルの中にある Main Camera という項目を選びます。Inspector のタブに Main Camera と表示されていれば、カメラの選択に成功しています。

image.png

Main Camera を選んだ状態で、Inspector を下のほうにスクロールしていくと、Add Component ボタンがあるので、これを押します。

image.png

キー入力で検索できるようになるので、ここに Third と入力します。すると、Third Person Camera という項目が選べるようになるので、これを選びます。

image.png

選ぶと、Third Person Camera という項目が Inspector 内に追加されます。

image.png

これでカメラの追従設定は終了です。再生ボタンを押すと、Unitychanの背後の視点から操作ができるようになっているはずです。

image.png

左側のControlキーを押すか、マウスの左クリックでUnityちゃんを前から見ることもできます。

image.png

画面内にあるメニュー(ボタン)を押すことで、Unityちゃんの表情を変えることもできます。

カメラの位置調整

正面のカメラがデフォルトでは少し遠い気がするので、近づけてみます。左側にある Hierarchy パネルから unitychan の左にある三角形を押して、下の階層の項目を表示させます。この中から FrontPos という項目を選びます。

image.png

Inspector に FrontPos (Unityちゃんの正面カメラの位置)の情報が表示されるので、ここの Z の項目の数字を下げます。デフォルトでは 2.6くらいになっているのを、1~1.5くらいにするとよい感じがします。

image.png

数字を変更すると、Scene ウィンドウの中にカメラの位置が x,y,z 軸の矢印で表示されるので、それを見ながらよさそうな位置に移動させます。設定できたら再生してみます。

image.png

数値を調整すれば、もっとアップにすることもできます。

トラブルシューティング

うまくいかない場合は、下記をチェックしてみてください。ひとつでも違うと、同じ操作をしても同じ結果にならないかもしれません。

  • 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現在)。

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

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通り

  1. Unity Editorがインストールされたディレクトリ内のScriptTemplatesを修正する
  2. Assets/ScriptTemplatesを設置する

1は良い記事を見つけたのでこちらの記事をご覧下さい。 
今回は2の説明です。1との違いはインストールディレクトリを触らないので気軽に使えます。プロジェクトによって変更することもできるので汎用性が高いです。

2. Assets/ScriptTemplatesを設置する

スクリーンショット 2020-02-26 19.18.57.png
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
{

}

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

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通り

  1. Unity Editorがインストールされたディレクトリ内のScriptTemplatesを修正する
  2. Assets/ScriptTemplatesを設置する

1は良い記事を見つけたのでこちらの記事をご覧下さい。 
今回は2の説明です。1との違いはインストールディレクトリを触らないので気軽に使えます。プロジェクトによって変更することもできるので汎用性が高いです。

2. Assets/ScriptTemplatesを設置する

スクリーンショット 2020-02-26 19.18.57.png
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
{

}

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

UnityCollabrateで招待できてもプロジェクトがダウンロードできなかった場合

Unity Collabrateで共同制作者とプロジェクトファイルを共有した際に詰まったので共有します。
(プロジェクトファイルをUnity Collabrateで使用するためにはこちらを参考にしました
https://qiita.com/warapuri/items/bfb2a7cdbbcebaa172cc)

共同制作者にプロジェクトファイルの存在は伝わっているものの、ダウンロードができない状態でした。
結論、チームに招待すると解決しました。

https://id.unity.com/ja/account/edit
上記のURLからUnityIDページに飛び、左側の「組織」を選択します。
自分が作成したプロジェクトを開きます。
「メンバー&グループ」をクリックします。
erara.PNG
すると、右側に「メンバーを追加」があるのでクリック
fgsdfgsTrt.PNG
メンバーのメールアドレスと組織の担当を割り当てて招待メールを送ります。
(ちなみに組織の役割ですがこちらを参考にしてください。
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-)

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

『Unity C# 個人用メモ』 オブジェクトをクリックした座標へ移動させる(ナビゲーション不使用

クリックした位置の座標を取得し移動させる

RayRaycastHitを使用してオブジェクトをクリックした座標へ移動させる
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 poshit.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()で対象を移動先まで移動させることが出来る
今回は本体クリックされた座標へ設定された速度で移動させる。となる

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

[Unity]音楽が再生されない

事象

UnityでUnityWebRequestMultimedia.GetAudioClipを実行した際に下記のエラーが発生

unity Streaming of 'mpeg' on this platform is not supported local

対処法

Build Settings>Platformを変更したら解決された。
Unityの設定を変更している時にPlatformが変わってしまったよう。

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

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 1080 

800x600で起動

    $ test.exe -screen-width 800 -screen-height 600 
    $ test.app/Contents/MacOS/test -screen-width 800 -screen-height 600

※以後、デフォルトで指定した解像度で起動する

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

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 1080 

800x600で起動

    $ test.exe -screen-width 800 -screen-height 600 
    $ test.app/Contents/MacOS/test -screen-width 800 -screen-height 600

※以後、デフォルトで指定した解像度で起動する

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

C#の演習問題:しまづ君にプログラミングを教えよう!【Unityゲームスタジオ スタジオしまづ】

(ベータ版)

これはあなた自身の物語です

ときは戦国、、、
ゲーム開発をするためにプログラミングを学び始めたしまづ君(永遠の3才)。
ところが彼はまだまだプログラミングのことがわかっていません。
のちに世界を救うこととなる「スタジオしまづ」設立のために彼にプログラミングを教えましょう!

演習問題を行う前の準備:準備中

演習問題1:変数の宣言方法がわかっている?

しまづくん:コードを書いていたらこんなエラーが出てしまったよ。。。
どうすればいいかな?
スクリーンショット 2020-02-26 9.19.55.png

しまづ君のコード

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    myStadio = "スタジオしまづ";
    void Start()
    {
        Debug.Log(myStadio);
    }
}

---解答ルパン---

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    string myStadio = "スタジオしまづ";
    void Start()
    {
        Debug.Log(myStadio);
    }
}

演習問題2:変数の種類(データ型)がわかっているか

しまづくん:僕のプロフィールをUnityさんに教えようとしたら、こんなエラーが出てしまったよ。。。
どうすればいいかな?
スクリーンショット 2020-02-26 9.40.19.png

Question.cs
using 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.cs
using 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 + "日");
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#&Unityの演習問題:しまづ君にプログラミングを教えよう!【スタジオしまづアカデミー】

(ベータ版:いいねと思ったらtwitterに投稿してもらえると嬉しいです^^)
(おすすめの問題があれば、編集リクエストで追加していただけると助かります)

これはあなた自身の物語です

ときは戦国、、、
ゲーム開発をするためにプログラミングを学び始めたしまづ君(永遠の3才)。
ところが彼はまだまだプログラミングのことがわかっていません。
のちに世界を救うこととなる「スタジオしまづ」設立のために彼にプログラミングを教えましょう!

演習問題を行う前の準備:準備中

スタジオしまづのYouTube
スタジオしまづの学習サイト

演習問題1:変数の宣言方法がわかっている?

しまづくん:コードを書いていたらこんなエラーが出てしまったよ。。。
どうすればいいかな?
スクリーンショット 2020-02-26 9.19.55.png

しまづ君のコード

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    myStadio = "スタジオしまづ";
    void Start()
    {
        Debug.Log(myStadio);
    }
}

---解答ルパン---

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    string myStadio = "スタジオしまづ";
    void Start()
    {
        Debug.Log(myStadio);
    }
}

しまづ君:ありがとう!変数の宣言方法がわかったよ^^

演習問題2:変数の種類(データ型)がわかっているか

しまづくん:僕のプロフィールをUnityさんに教えようとしたら、こんなエラーが出てしまったよ。。。
どうすればいいかな?
スクリーンショット 2020-02-26 9.40.19.png

Question.cs
using 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.cs
using 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.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    // 123かける456割る2の計算結果をコンソールに表示したい
    void Start()
    {
    }
}

---解答ルパン---

Question.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int n = 10;
    int m = 2;
    void Start()
    {
        Debug.Log(n = m);
    }
}

---解答ルパン---

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int n = 10;
    int m = 2;
    void Start()
    {
        Debug.Log(n == m);
    }
}

しまづ君:教えてくれてありがとう!プログラムの=は数学の=と違うんだね^^

演習問題8:比較演算子(否定)がわかっているか

しまづくん:10と2が違う数字か調べてみたら、エラーが出ちゃった!!!!
どこが違うと思う?

スクリーンショット 2020-02-27 11.14.32.png

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int n = 10;
    int m = 2;
    void Start()
    {
        Debug.Log(n =! m);
    }
}


---解答ルパン---

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int n = 10;
    int m = 2;
    void Start()
    {
        Debug.Log(n != m);
    }
}

しまづ君:教えてくれてありがとう! 「!」の位置に決まりがあるんだね^^

演習問題9:ifがわかっているか

しまづくん:HPが0になったら「戦闘不能」と表示したかったんだけど、ずっと出ちゃってる。。。
どうすればいいかな?

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int hp = 100;
    void Start()
    {
        if (hp >= 0)
        {
            Debug.Log("戦闘不能");
        }
    }
}

---解答ルパン---

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int hp = 100;
    void Start()
    {
        if (hp <= 0)
        {
            Debug.Log("戦闘不能");
        }
    }
}

しまづ君:教えてくれてありがとう! この辺りよくわ違えちゃうかも><

演習問題10:if elseがわかっているか

しまづくん:HPが0になったら「戦闘不能」、それ以外のときは「しまちゅー元気でちゅー」と表示したかったんだけど、ずっと元気なんだw
どうすればいいかな?

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int hp = 100;
    void Start()
    {
        if (hp <= 0)
        {
            Debug.Log("戦闘不能");
        }
        Debug.Log("しまちゅー元気でちゅー");
    }
}


---解答ルパン---

Question.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using 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.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int n = 1000;

    void Start()
    {
        while (n <= 2000)
        {
            Debug.Log(n);
            n++;
        }
    }
}

---解答ルパン---

Question.cs
using 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.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    int count = 10;

    void Start()
    {
        while (count <= 1000) {
            Debug.Log(count);
            count = count + 1;
        }
   }
}

---解答ルパン---

Question.cs
using 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.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    void Start()
    {
        for (int i=10; i<=1000; i++)
        {
            Debug.Log(i);
        }
   }
}

---解答ルパン---

Question.cs
using 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.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    void Start()
    {
   }
}

---解答ルパン---

Question.cs
using UnityEngine;

public class Question : MonoBehaviour
{
    void Start()
    {
        for (int i = 0; i < 100; i++)
        {
            if ( i%3 == 0)
            {
                continue;
            }
            Debug.Log(i);
        }
    }
}

しまづくん:すごーい!continueの使い方がわかったよ^^

スタジオしまづのYouTube
スタジオしまづの学習サイト

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

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);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を入れておけばいいだけです。

以上です!自分があまり説明などを書いたことがないのであまり説明が上手ではないと思います、なのでわからないところや質問があったらどんどん書いてください。

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

選択した場所をコメントアウトする方法#Unityゲーム制作01

どうも、わたたかです。
普段はTwitterで活動しているただのゲーマーです。

で、ゲーム制作をボチボチしているのでこれから
自分のゲーム制作のアウトプットをしていこうと思います。
まとめはnoteに書こうと思ってるので少し雑になっても完結なアウトプットになればと思ってます。

ますます言っててすみません。気をつけます

本題に入ります

選択した場所をコメントアウトする方法

※Visual studio2017を使用しています。

コメントアウトしたい部分を選択

int a;

マウスでもキーボードでも何でもいいです。

crtl+k → crtl+C と押す

//int a;

こうなります。

これを解除するには
crtl+k → crtl+u と押してください。

int a;

//が外れます。

そこそこ便利なので使ってみましょう。

以上です。

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

選択した場所をコメントアウトする方法/Unityゲーム制作01

どうも、わたたかです。
普段はTwitterで活動しているただのゲーマーです。

で、ゲーム制作をボチボチしているのでこれから
自分のゲーム制作のアウトプットをしていこうと思います。
まとめはnoteに書こうと思ってるので少し雑になっても完結なアウトプットになればと思ってます。

ますます言っててすみません。気をつけます

本題に入ります

選択した場所をコメントアウトする方法

※Visual studio2017を使用しています。

コメントアウトしたい部分を選択

int a;

マウスでもキーボードでも何でもいいです。

crtl+k → crtl+C と押す

//int a;

こうなります。

これを解除するには
crtl+k → crtl+u と押してください。

int a;

//が外れます。

そこそこ便利なので使ってみましょう。

以上です。

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

PostProcessでカラーパレットの差し替え出来るやつ作った

PostProcessingPaletteSwap

https://github.com/kyubuns/PostProcessingPaletteSwap

出来ること

output

カラーパレットのサンプル

a.png

出来ないこと

  • PostProcessでやってるので、こっちのキャラだけ色替え!みたいなのは(ちょっと工夫しないと)出来ません。あくまで画面全体が対象です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む