20200221のUnityに関する記事は8件です。

『Unity C# 個人用メモ』 アイテムの生成一括と一括削除

public class Seisei : MonoBehaviour
{
    //生成したいオブジェクトを宣言
    [SerializeField] GameObject obj = default;

    void Update()
    {
        //一括生成
        if (Input.GetMouseButtonDown(0))
        {
            //x座標用
            for (int xi = 0; xi < 5; xi++)
            {
                //y座標用
                for (int zi = 0; zi < 3; zi++)
                {
                    //生成(対象,座標,角度)
                    Instantiate(obj, new Vector3(xi, 1f, zi), Quaternion.identity);
                }
            }
        }
    //一括削除
    if (Input.GetMouseButtonDown(1))
    {
        //あらかじめオブジェクトにタグをつけておいて、そのタグのついたオブジェクトをまとめて配列にぶち込む
        GameObject[] objs = GameObject.FindGameObjectsWithTag("obj");

        //配列onjsにぶち込んだものをを一纏めにする
        foreach(GameObject clone in objs)
        {
            Destroy(clone);
        }
    }
}

}

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

『Unity C# 個人用メモ』 アイテムの一括生成と一括削除

public class Seisei : MonoBehaviour
{
    //生成したいオブジェクトを宣言
    [SerializeField] GameObject obj = default;

    void Update()
    {
        //一括生成
        if (Input.GetMouseButtonDown(0))
        {
            //x座標用
            for (int xi = 0; xi < 5; xi++)
            {
                //y座標用
                for (int zi = 0; zi < 3; zi++)
                {
                    //生成(対象,座標,角度)
                    Instantiate(obj, new Vector3(xi, 1f, zi), Quaternion.identity);
                }
            }
        }
    //一括削除
    if (Input.GetMouseButtonDown(1))
    {
        //あらかじめオブジェクトにタグをつけておいて、そのタグのついたオブジェクトをまとめて配列にぶち込む
        GameObject[] objs = GameObject.FindGameObjectsWithTag("obj");

        //配列onjsにぶち込んだものをを一纏めにする
        foreach(GameObject clone in objs)
        {
            Destroy(clone);
        }
    }
}

}

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

『Unity C# 初心者メモ』オブジェクトをランダムな座標へ一定時間ごとに移動させる

自分用メモ
わざと区切ってるけど全部1枚の流れ

必要になる素材を作る

public class RandomIdou : MonoBehaviour
{
    //座標を再計算しても良いかの判定
    private bool bl = true;

    //移動先の座標
    private Vector3 pos;

    //x座標代入用
    private float x;

    //z座標代入用
    private float z;

    //移動する速度
    private float speed = 3f;

    //移動範囲計算用
    private int i = 5;

初動用の座標を作る

    void Start()
    {
        //Randomな値を代入する
        x = Random.Range(-i, i);
        z = Random.Range(-i, i);

        //↑で出た値を座標に代入する
        pos = new Vector3(x, transform.position.y, z);
    }

座標の移動と再計算

    void Update()
    {
        //移動するときの速度用
        float step = speed * Time.deltaTime;

        //座標をpos座標へstepの速度で移動させる
        transform.position = Vector3.MoveTowards(transform.position, pos, step);

        //座標の再計算を行ってよく、座標が目的地に着いた時
        if (bl == true && transform.position == pos)
        {
            //2秒後再計算を行う
            Invoke("Idou", 2f);
            //毎フレーム計算しない様に判定を変える
            bl = false;
        }
    }

再計算用のメソッド

    void Idou()
    {
        //移動するときの値への減少率を計算
        float xp = 1f - System.Math.Abs(transform.position.x) / 5f;
        float zp = 1f - System.Math.Abs(transform.position.z) / 5f;

        //x座標が中心より大きい時(中央より右側へ行ったとき
        if (transform.position.x > 0)
        {
            //右側へ移動する範囲にのみ減少率を掛けRandomな値を計算する
            x = Random.Range(-i, i * xp);
        }
        //x座標が中心より小さい時(中央より左側へ行ったとき
        else
        {
            //左側へ移動する範囲にのみ減少率を掛けRandomな値を計算する
            x = Random.Range(-i * xp, i);
        }

        //y座標ver(以下略
        if (transform.position.z > 0)
        {
            z = Random.Range(-i, i * zp);
        }
        else
        {
            z = Random.Range(-i * zp, i);
        }

        //目的地座標posに計算結果の値を代入する
        pos = new Vector3(x, transform.position.y, z);

        //再計算をしてもよい判定を付ける
        bl = true;
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

using UnityEditer; は build 環境に含めることができない

はじめに

はおー!Koo(@Fuckoo0)です。
本記事は using UnityEditer; をすると build できなくなった時のお話です。

結論

結論を先に書いてしまうと, UnityEditer API を使用した関数をbuild環境に含めてbuildすることは出来ません。
UnityEditer API は, そもそも Editer 拡張などの使用を想定されていて, build した後の exe で Runtime で使用することは想定されていません。

そう!!!!使用できないのである!!!!

UnityEditer API の reference を読んでもわかる…!!
https://docs.unity3d.com/ScriptReference/UnityEditor.html

対応策

  • build環境で使えるAPIか確認してから使おう
    • build して初めて気づくと実装しなおしになるのでだいぶ痛い
  • 定期的にbuildしよう
    • 最終的な環境で使えるかどうかは環境を作ってあげるのが一番手っ取り早い
  • using UnityEditer; をする際は以下のように Platform の指定をすることで UnityEditer 外の環境ではコードが無視されるようになる (build は通るが API が使えるわけではないので注意)
#if UNITY_EDITER
using UnityEditer;
#endif
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

『Unity C# 個人用メモ』 WASDや矢印キーでオブジェクトの位置を動かす

自分用メモであり同じような初心者の方へ向けた自分なりの解説
名称がちゃんとあっているのかどうかは正直わかりませn

オブジェクトの位置を動かす場合

位置を一瞬で移動させる

object の  座標   は 座標宣言   x   y  z
transform.position = new Vector3( 3f, 0, 2f);

とすればオブジェクトの位置がx座標が3f,y座標は0,x座標が2fとなる

少しずつ移動させる

transform.position = new Vector3(transform.position.x, 
                  transform.position.y,
                  transform.position.z+0.2f);

void Update内にこのように書くと少しずつ奥に進むようになる
呼ばれる度にオブジェクトをz軸方向へ0.2fを足すという意味

WASDや矢印キーを入力をしたときに移動させる

適当に作ったゲームオブジェクトにRigidbodyコンポーネントを追加してから
以下の様にスクリプトを書く

public class NewBehaviourScript : MonoBehaviour
{
    //Rigidbody型のrbという変数を作る
    private Rigidbody rb;

    //float型のpowerという変数を作り、3fを代入する
    private float power = 3f;

    private void Start()
    {
        //リジットボディを取得しrbに代入する
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        //キー入力による値を代入(解説は後で
        float x = Input.GetAxisRaw("Horizontal");
        float z = Input.GetAxisRaw("Vertical");

        //↑で代入された値をVector3型のIdouHoukouという変数に代入する
        Vector3 IdouHoukou = new Vector3(x, 0, z);

        //rbに力を加える
        //velocityは質量などの物理演算を無視するときに使う
        rb.velocity = IdouHoukou * power;

        //rbの回転をさせない様にする
        rb.constraints = RigidbodyConstraints.FreezeRotation;

        //移動範囲の制限
        transform.position = new Vector3(
            Mathf.Clamp(transform.position.x, -5f, 5f),
            Mathf.Clamp(transform.position.y,1f,1f),
         Mathf.Clamp(transform.position.z, 5f, 5f));
    }
}

これでWASDや矢印キーを入力したときに移動が出来るようになります

Input.GetAxisRaw("Horizontal");
Input.GetAxisRaw("Vertical");

Input.GetAxisRaw
とは入力された物に対してint型(整数)で-1~1を返す
HorizontalA,D,がUnityに初期設定として登録されており、
Aが入力されている時は-1
何も入力されていない時は0
Dが入力されている時はを返す

同じようにVerticalは、
sが入力されている時は-1
何も入力されていない時は0
wが入力されている時はを返す

つまり先ほど書いた以下の

Vector3 idou = new Vector3(x, 0, z);

new Vector3(x, 0, z)このx部分とz部分に-1,0,1が代入される

その後

rb.velocity = idou * speed;

とあるので
xの値が-1ならx(-1)*speed(3f)となりx軸-3fの力を加える
xの値が0ならx(0)*speed(3f)となりx軸0の力を加える
xの値が1ならx(1)*speed(3f)となりx軸3fの力を加える
ということになる
y軸も同じ考えなので割愛

rb.constraints = RigidbodyConstraints.FreezeRotation;

こちらはゲームオブジェクトのインスペクタ内の
Rigidbodyコンポーネントの下部にある
constraintsという項目の2段目にある
回転するかどうかのチェックマークをスクリプト上でつけているだけなので
チェックマークを付けた場合は記入しなくても問題はありません。(てかチェック付けた方が楽)

このままだと入力がある限り際限なく移動し続けるので制限をつけます

transform.position = new Vector3(
            Mathf.Clamp(transform.position.x, -5f, 5f),
            Mathf.Clamp(transform.position.y,1f,1f),
         Mathf.Clamp(transform.position.z, -5f, 5f));

Mathf.Clamp(対象,最小値,最大値)を使用することで
簡単にtransform.positionMathf.Clamp()内の範囲以上には移動できなくなるという処理が作れます
使わない場合

        if (transform.position.x >= -5f)
        {
            transform.position = new Vector3(-5f, transform.position.y, transform.position.z);
        }

こんな感じの物をx,y,zそれぞれ2パターンで合計6回も書くことになるのでMathf.Clampは偉大です

以上

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

『Unity C#』ガチ初心者の自分用メモ 型とか演算子

よく使う型

int ・・・整数
/// -1,0,1 
flot・・・小数点以下を含む
/// fが必須 -1.5f,1.5f 
string・・・文字列
/// ""が必須 "こんにちは"
bool()・・・真偽判定
/// true(真) or false(偽)
Vector3(2)・・・座標とかベクトル
/// VectorのVは大文字なのを忘れないで!!
/// 使う時は Vector3 zahyou = new Vector3(〇,〇,〇)の様に宣言する
/// Vector2の場合なら new Vector2(〇,〇)の様な感じ
GameObject・・・ゲームオブジェクト
/// 用途によってGameObjectとgameObjectの二つ使い分けるので気を付ける
/// 宣言するときは```private GameObject ○○ ```など
/// 使用するときは```gameObject.GetComponent<〇〇>();```など
Transform・・・トランスフォーム。オブジェクトのインスペクタ(Unity画面の右側)の上の方にある座標とか回転入力するときに使うやつ
/// 宣言するときは```private Transform ○○;```など
///使用するときは```transform.position;```など

演算子

計算で使うやつ
四則演算省略
+= 追加(=が後ろ)
-= 差引(=が後ろ)
++ 1増やす
-- 1減らす
=  代入

if分で使うやつ
== 同じであるとき
!= 同じではない時
&& どちら[も]
|| どちら[か]
>  大なり
>= 大なりイコール(=が後ろ)
<  小なり
>= 小なりイコール(=が後ろ)

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

『Unity C# 個人用メモ』 ガチ初心者の自分用の用語メモ

初心者の自分用のメモ
大体こんな感じだよって思ってればいいやつ

MonoBehaviour(モノビヘイビア)

全てのスクリプトから派生するベースクラス

ヒエラルキービュー

画面左。シーンビューに配置したオブジェクトの一覧、階層構造。

プロジェクトビュー

画面下。ゲームで使う素材を管理。

インスペクタ

画面右。選択しているオブジェクトの詳しい情報がわかる。 座標・オブジェクトの大きさ・配置など。

メソッド

void Start()
{

}

メソッドとはこのvoid 〇〇のこと。上の物であればStart()がメソッドになる

アクセス修飾子

public int = 1;
private int = 1;

アクセス修飾子とはこのpublicやprivateのこと

変数・型

int a ;

int ← 型
a  ← 変数
intという型のaという変数を作るという意味になる

引数(ひきすう)

Vector3 zahyou = new Vector3(〇,〇,〇);

new Vector3(〇,〇,〇);〇のことなど

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

UnityのStandardShaderってダサい気がする人へ贈る言葉

概要

Unityの「StandardShader」ってダサいイメージありませんか?
最初からあるし無料だし、カードゲームならスタンダードセットっていうと初心者が買う基本パーツを手に入れる為のものだし、絵を綺麗にする時ってStandardShaderの話よりPost Processing Stackの方が出てくるし、ポスプロでブルームと被写体深度と色収差で助走付けて殴った方がよさそうって感じするし…

そんな事ない?分かる?
分かる!って人はこの記事読むといいかもしれないです。

StandardShaderの正体

UnityのstandardShaderは「物理ベースレンダリング」に基づいて設計されたShaderである。
っていうとよく分からないので「ピクサーがシュガーラッシュ作る時に考えたヤツ(に基づいて実装されたShader)」っていうと(オッ?)ってなるんじゃないでしょうか。

そもそもCGのレンダリングは何かの法則をシュミレーションして絵を出してます。
ただ、厳密にシュミレーションすると非常に時間がかかってしまうので、疑似的な方法や近似する手法がとられています。ある程度の精度は犠牲にして高速化しているわけです。
そんなこんなで色々なShaderが生まれたわけです。

で、色々なShaderがあると便利なように見えますが、その分パラメータや調整項目も増えるので「アーティストが狙った絵を出すにはどないすればええねん」ってなるわけですね。

そこで、ピクサーの偉い人は「世の中の物質って金属と非金属、表面の粗さでだいたい分類できるよね」っていう物理法則に気づいて、この法則に従ったShaderを作りました。
これが物理ベースレンダリング(PBR)と呼ばれている概念です。

(めちゃくちゃざっくり言うと)「その物質が金属であるか・非金属であるか?」「表面がツルツルか?ざらざらか?」の質問に答えると、そういう物質の絵を出してくれるShaderです。
これでアーティストは狙った絵を出せるようになりました!やったね。

物理ベースシェーディング フリー百科事典『ウィキペディア(Wikipedia)』

物理ベースレンダリングを詳しく

How to Use Blender's New "Ultimate" Shader: The Principled BSDF
こちらの動画が参考になります。
英語なのでこの記事では字幕の出し方だけ捕捉しておきます。

2020-02-21_08h00_30.png

2020-02-21_08h01_48.png

Unityでやるにはどうするの?

Standard Shader Unity DOCUMENTATION
↑のリンクにアクセスする

2020-02-21_08h09_26.png
左側のバーから見たい項目を選べばOK

おわり

CGや3Dつよつよな人にとっては当たり前の超常識なんですが、意外と体系的に学ぶパスが少ない気がする…
CGって意外と歴史が浅くて、そもそも物理ベースレンダリングの考え方は2012年(約8年前)に出たものだし、おしゃれなノイズのアルゴリズムも意外と最近出たんだなってものも多い。

毎年シーグラフをおっかけるのが手っ取り早そうだけど、英語だし論文を読めないといけないし、数式も理解する必要があって一定のハードルがある。
で、そこらへん分かりやすくしたCG関係の書籍に関しても、ニッチなのでドカドカ情報が出るわけでもない。
というわけで 知ってる人にとっては当たり前だけど、知らない人が知るキッカケが少ない みたいなのは漠然と感じる。

VRChatとかでリアリスティックなワールドをセットアップしたい場合、StandardShaderを使いこなしてゆくのがいいかもしれない。

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