- 投稿日:2020-02-21T21:25:27+09:00
『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); } } }}
- 投稿日:2020-02-21T21:25:27+09:00
『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); } } }}
- 投稿日:2020-02-21T19:33:47+09:00
『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; }
- 投稿日:2020-02-21T18:13:57+09:00
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
- 投稿日:2020-02-21T17:32:43+09:00
『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を返す
Horizontal
はA
,D
と←
,→
がUnityに初期設定として登録されており、
A
や←
が入力されている時は-1
、
何も入力されていない時は0
、
D
や→
が入力されている時は1
を返す同じように
Vertical
は、
s
と↓
が入力されている時は-1
、
何も入力されていない時は0
、
w
と↑
が入力されている時は1
を返すつまり先ほど書いた以下の
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.position
がMathf.Clamp()
内の範囲以上には移動できなくなるという処理が作れます
使わない場合if (transform.position.x >= -5f) { transform.position = new Vector3(-5f, transform.position.y, transform.position.z); }こんな感じの物を
x
,y
,z
それぞれ2パターンで合計6回も書くことになるのでMathf.Clamp
は偉大です以上
- 投稿日:2020-02-21T14:49:57+09:00
『Unity C#』ガチ初心者の自分用メモ 型とか演算子
よく使う型
int ・・・整数 /// -1,0,1flot・・・小数点以下を含む /// fが必須 -1.5f,1.5fstring・・・文字列 /// ""が必須 "こんにちは"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分で使うやつ
==
同じであるとき
!=
同じではない時
&&
どちら[も]
||
どちら[か]
>
大なり
>=
大なりイコール(=
が後ろ)
<
小なり
>=
小なりイコール(=
が後ろ)
- 投稿日:2020-02-21T13:59:26+09:00
『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(〇,〇,〇);〇のことなど
- 投稿日:2020-02-21T08:24:36+09:00
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
こちらの動画が参考になります。
英語なのでこの記事では字幕の出し方だけ捕捉しておきます。Unityでやるにはどうするの?
Standard Shader Unity DOCUMENTATION
↑のリンクにアクセスするおわり
CGや3Dつよつよな人にとっては当たり前の超常識なんですが、意外と体系的に学ぶパスが少ない気がする…
CGって意外と歴史が浅くて、そもそも物理ベースレンダリングの考え方は2012年(約8年前)に出たものだし、おしゃれなノイズのアルゴリズムも意外と最近出たんだなってものも多い。毎年シーグラフをおっかけるのが手っ取り早そうだけど、英語だし論文を読めないといけないし、数式も理解する必要があって一定のハードルがある。
で、そこらへん分かりやすくしたCG関係の書籍に関しても、ニッチなのでドカドカ情報が出るわけでもない。
というわけで 知ってる人にとっては当たり前だけど、知らない人が知るキッカケが少ない みたいなのは漠然と感じる。VRChatとかでリアリスティックなワールドをセットアップしたい場合、StandardShaderを使いこなしてゆくのがいいかもしれない。