ナニコレ珍百景⓵ - TejimaTuyoshi/returnread GitHub Wiki
メモメモ
匿名メソッドは、「これ以外」でも単純に「使い捨て」として使用する。
ラムダ式は「省略」するのが目的。最悪、(引数の型、引数)さえ守れていれば、省略を「開始」できる。逆も然り。
=> は 「goes to」となるのでしっかり矢印を見ること。
OrderBy = 昇順に並び替え
group = データをグループ化する。(列挙に近い)
SetEase()で
これを参照しながら作れば多くの種類を作れる。
Incremental:そこから始まる
Yoyo:そこから戻る
Restart:初めに戻る
DOTween.to()は「あらゆるものを滑らかにする。」
(DOGetter[デリゲート] getter,DOTSetter[デリゲート] setter, T endValue,float dicion{かける秒数})
ゲージの「更新」をしてほしいので、setterで引数を求めている。
この際にラムダ式を使用することが可能。
インシデントはそろえる!
ゲームを作る際「でかいマップ」は作らず、「小さいマップ」を複数個作り、マップを跨ったものを作った方が複数人で作業がしやすい!
さらに、メモリの問題で足りなくなってしまうので注意!
例:ドラクエのように「切り替わるように」作っていく。
このようにすることで{先のマップを「ロード」しつつ、元のマップを削除することでデータを節約できる。}
SOLID原則は「長期」用。ゲームジャムではやらない方が良い!。
一番やりやすいのは、「オレオレシングルトン」を作っておくとやりやすい!
スクリプタブオブジェクトは「少ない種類のキャラクター」を作る場合。
多い場合は、「エクセル」から持ってくること。
ForEach = 一つずつ、その行動を回す。forの変化形。(メソッド可)
foreach時、ToList()をする理由 = stringが charに近い。 Listに対してのメソッドになっているので、使うことが可能。
・「DOTween」[do tween]を使うと、「時間をかけてその数値にする」ことが可能。
ただし、using DG.Tweening;が頭に必要。
Array = ForEachに直接的につなげることが可能。
float で行っている場合、数字の後ろにfを付けることでfloat化が可能。(フレームではない。)
Math.Floor = 少数点以下を「切り捨てる」。
型には注意!
int * int = int
float * float = float
float * int = float
余りで計算,そのまま出力することが可能。
ConvertAll = リスト内の要素をすべて変更する
$ =文字列の中に変数を出力({}が必要)
int は自動的に小数点切り捨てをする。
platform Effector = 当たり判定を一方向にすることが可能。
Trim = 指定されたものを「カット」(無くす)する。「トリミング」って聞くよね。
for文の変数名は基本[i]の方が良い。
実質int = Char 型
int にすると、実は0が消える。
D2 = デシマル(10進数)
hour = hour + minute / 60 (minute => 60 = 1,minute < 60 = 0)
minute = (minete + 30) % 60
が時刻で可能に(これは「30分後」を表す)。
変数自体にも「++」が使用可能(for文内だけでなくという話)
split の引数は()内にある「変数(変数内にある文字)」を区切れる。(複数の文字がある状態で区切りたいときに使用)ただし、char型で使用すること。
PadLeft = (桁数,変数や数値、文字など)が可能。これのこと(埋めること)を「パディング」という。
与えられた数値は「for文」で使用可能なので、その分回す。
contain = 文字列内に含まれているかを判定する。
index of でも可
テクスチャ = 展開図のようになっていて、後々くっつけるときに立体図になる。
スプライト = ただの絵。
TransformDirection = そのobjectから見てどの方向を入力しているかを判定する。
(ただし、Y座標について、Oにしておかないとめり込む。)
Array.IndexOf=指定されたオブジェクトを 1 次元の配列または配列の要素範囲内で検索し、最初に見つかったオブジェクトのインデックスを返す。
シングルトンは、ポピュラーなので知っていないとマズイ。
拡張メソッド = 二つあるはずなのに、「thisOO」のように指定することで引数を減らすことができる。
これはLinq が例として挙げられる。
Dotweenも例に挙げられる。
拡張メソッドの見分け方は「コードの隣にある箱に下矢印が付いているかどうか」である。
英語。必要。
ちなみに[concat]は「2つ以上のセル内の文字列を結合して表示できる関数」である。(初知)
コードにおける[拡張子]は{誤り}で英語に直すとextensionつまり拡張メソッド。
value = 結果的に数字になる。→計算しないなら、intに直す必要がない。
addで配列のキーを追加するのが普通。
でも、
配列[変数] = 変数;
で可能に。
Dictionary(Key,value);
for以外で使用する場合、for内で定義すれば節約することが可能。
for文の一つ目の部分は「;」のみで終わらせても可能に。
for(OOOOO){}
のように空のボックスを作ることも可能。
変数の中に同じ()が二つ以上ある状態 = 入れ子構造
これは短縮する際に使用するので、見づらい。
インデント = ifの後の段落を落とすこと。
ContainsKey(TKey) | 指定したキーが Dictionary<TKey,TValue> に格納されているかどうかを判断する。
++ = インクリメント(インクリメンタル演算子)
while = ループの()内はifみたい。
再帰呼び出し=楽だけど時間がかかる。
&& = アンパサンド
オブジェクト等チェックボックスの変更 = SetActive
アニメーションのAnyから伸ばす理由=トランジションを多く張って見づらい。
=パラメータを決めておけばその状態にできる。
キャスト=型を変換すること。(例:int a = 1 => float a = 1.0f)
(a as int)という変換方法もある。
parse = 成り立っているかチェックする。
TryParse=正常系でないとき(数字である確率が不明)のparseになる。(bool型で差別)
継承している場合、相互に変換可能。
別のコライダーに変換は不可能。
型としてもらっている=形の状態も保存
他の形のまま別のコライダーの形には変換できないから。
継承元に代入 = アップキャスト
継承元から代入 = ダウンキャスト
(変数{先} is 変数{元})戻り値bool型
(変数{先}as 変数{元})戻り値変換値or[null]
参照型にキャストする=ボクシング
参照型からキャストする=アンボクシング
{ただし、あまりやらない方がいい。}
メモリーのコピーが始まるので時間が始まる(ヒープ <=> スタック)<=これの行き来によるもの。
継承関係にあるもの = 暗黙的に変換可能。
継承関係にないもの = 「明示的でない」から無理。
C#はメモリがある程度余裕を持たせるように作られている。
~ = チルダー
メモリに余裕がある場合に呼ばれる。
C#は勝手にクラス等は破棄されない。
普通に作った場合、最短でそのソリューションを抜けてからなので、
すごく時間がかかる。
GC.Collect(); =カベージコレクターが活動させる。
これによって使われていないものを消して、メモリの容量を開けることができる。
newを作って消していない = マズイ。メモリが・・・
そのため、プレハブを生成する時は Instatiateを作り、deleteで消えるように新たに作ったのがUnityだ。
変数を生成する=>関数に入る=>関数から抜ける=>GCが走る=>変数が開放される。
これにおける、変数の生成(instantiate)と変数を消す(delete)を作った。
これは「ゲームオブジェクト」でないと使用できない。
メモリの開放を行うために、Unity側が作ったものである。
ただし、同じように別の場所で使うと、
deleteの「実は消えてません」現象によって、
メモリの圧迫で危険になる恐れも・・・
⓵クラスがIDisposableを継承していること。
⓶using内でnewにすること。
即時解放できる。
サーバーを立てる際、極限までメモリを解放できるようにすること。
サーバー自体はスペックがとてつもなく少ない。
Enumerable.Range = 最初に指定した数字から、変数などの数字が与えられる。
Select = 選んで変換する。
for文の中でint型の変数を指定して、そこに入れれば元々配列を作る必要がなくなる。
return = メソッドを終わらせる。その後のループ後は実装されない。=>あまり使用しない方が良い。
break = ループを終わらせる。そのループ後も実装される。
SetFloat("パラメータ名",変数や数値);
continue = ループを最初の行に戻す。
ただし、コンティニューを「邪道」と思う人もいるので注意。
monobehaviour の継承系の物がある場合はゲーム実行中は使用することはできない。
Rigidbody = newは無視される。
Gameobject = new可
SpriteRenderer = GameobjectにaddComponentすれば可
コード自体に使い方を書いておけば、他の人も使うことが可能に!
CreatePrimitive(Primitive=原始的)はUnityにおけるフリーオブジェクトを追加可能。
newよりinstantiateのほうが良い!
Unity(ゲームクリエイトソフト)の限界を少しずつ調べてみるべし。
nullreference=対象がないのに使おうとするとエラーに。
nullチェックのために「if (list == null)」と使うと、
その中身がしっかり行われているためである。
これは時々行うと良い。理由は、
他の人が使う際、チェックがなくエラーだけが出ると聞きに来る。
それは手間なので、チェックとしてelseの方にログで「それ、ないゾ」と言えば、
理解してくれる。
[]=>属性
実際にはこの()内に入っているもののことを属性という。(Attribute)
バグを取る際、ブレークポイントをよく使うものの、より分かりやすくしたものが、
条件付きブレークポイントである。
内容としては、特定の条件を満たした時にのみブレークする。(止める)
条件の種類
条件式=if文に近い
ヒットカウント=行われた数
基本はこの二つだが、これを行う際「速く行いたい」という動機が必要にある。
UnityEvent=UnityEngine.Eventsの物。
コードを書かずにそのobjectを動かす。
Invoke=UnityEventに入っている物を呼び出す。=>デリゲートの一つ。
これによってプログラムを書かずに実行可能に。
foreach => インデックスはいらないとき。
Console.WriteLineをラムダ式で書くことで、()内にif文を作ることが可能。
-- = -1に可能。
Console.ReadLineのみで変数を定義せずに使用可能。
intに変換する必要性がない場合、varのままにする。
「直接場所を交換」はできないので、「一度別の場所に移して入れなおす」ことを考える。
タプル = (変数[0],変数[1]) = (変数[1],変数[0]);のようにダイレクトに可能。{最新のものなのでpaizaには使えない。}これ自身は大分ポピュラー。
ただし、基本は「直接」はできないと思っていた方が良い。
Array.Resize = 配列を無理やり増減可能。しかし、メモリ上無理やり増減すると、実際には「作り直している」ので元をコピーしている際の時間を必要とする。
なので、増える際にはListの方が良い。
Take = 指定した要素までの要素を取得する。(Linq)
あらかじめ別の空白の「何か」を必要分だけ作り入れることで、もし仮に要素の「変換」や「追加」が起こった際、基本は{直接}行えないので、
その空白の場所を「預かり先」や、「変換後」として利用することが可能に
numの変数「n」をもし先に使用していた場合、「k」を利用することもある。
iにマイナスを入れることでエラーになってしまう。
separate = 何かと何かの間をつなぐ。
Math.Pow(num,i)= numをi乗する。(何乗する=Power)
ただしこれをfor文に入れると、初め(Xの1乗)から掛けなおしているので処理の無駄になっている。
そのため、変数に一度ずつ持たせたうえで出力させた方が良い。
*= これにより、一度ずつ掛けることが可能。
配列の[]の部分に「.Length」を使うことが可能。
_ = 変数として使うと、「破棄」することが可能。
\n = 改行する。
Resizeした場合、「元」の配列を変えているので新しい配列を用意する必要は無い。
a>>3= 右に3つ「シフト」する。
a & b = AND,a | b = OR,a ^ b = XOR, ~a = NOT(!もあるが、この場合は「全体」となる。それに対し、~は「一部」である。)
byte = 数字、二進数可能。
nullpointerexception = Nullなのに、メンバーを呼んだ場合(Nullで「メソッドを呼んで」はならない)にエラー。
「Nullであること」ではない。
変数がNullなのに、「メンバー」を呼んでいる。つまり、「変数」がエラーとしての原因となる。
GameObject.Find = Unity内のオブジェクトを探す。ただし、「非アクティブ」だとエラーになる。
一定のタイミングで1UPなど = 「判定」を動かす。ポイントの方を動かしてはならない。
配列 = 参照型。(値型でもいいが「キツイ」)
String = クラスなので「参照型」(Char型)
" = new string("")の略
なので、参照型だけど代入後に変数を”で変更すると変えた方が変わらない。
理由は、「分かりやすくするため」。
文字の場合は、そのまま文字を変更してしまうと、混乱してしまう恐れがあるので元が変わっても変更させない。
プリプロセサディレクティブ = 異なるプラットフォームの動作を一つのスクリプトで作成する際に使用する。
エディタースクリプト = UnityEditorの拡張を可能に。また、「新しい機能を作成」して挿入することが可能。
ちなみに、もともとあるUnity内の一部の物は拡張している。
が、エディタースクリプトは「Editor」のファイルに入っていないと「エラー」になる。
Char型 = 整数なので、並べ替えやfor文の条件文などに使用可能。
(Linq)Select,Sumは何回かループしているので非効率。
Console.WriteLine内で「計算」が可能。
foreach = 要素が「一つ」の場合は使用可能。
Indexof =>Array.Foreachなどでも可。
新たな配列を作って使用する場合、「bool」を使用した方が楽。
Physics.Raycast = bool型の戻り値が多い。=> レイキャストは、「オブジェクトに当たるとtrue」それ以外がfalseとなる。
RaycastHit hitinfo = 当たった際の情報が取得できる。本来なら、「射程距離」が変数等で存在するなら、「maxDistance」に設定する必要がある。
もし仮に、情報が足らないor持ってい過ぎる場合、コードソフトの「オーバーロード機能」を使ってどんなものがあるかを調べよう。
レーザーはあらかじめ「射程距離分」伸ばしておいて、障害物等にレーザーがぶつかった場合に変化させるようにした方が良い。
RaycastHit = レイキャストの当たっている場所に飛ばす。
LineRenderer = これで見えない「レーザー」等を「可視化」することが可能。
もし、レーザーが当たらなかった場所に対して「爆発エフェクトの発動」を無くしたい場合。
本来は、「当たっているかのbool」を作って、当たっていない場合は発動しないようにするのが普通。
しかし、「Vector3.Distance」にて差を求め、その差が射程距離以上であれば発動させないようにする。
1フレーム中にレイキャストを幾つも飛ばすと、重くなってしまう。
Update = 入力の受付。(Input系など。)
FixedUpdate = 実行感覚が変わると困る処理時に使用。
LateUpdate = アニメーションの処理(適当)アニメーションはフレーム単位が適当なので別にいい。
Addforceの場合、落下中は力が弱くなる。
Vector3 velocity = _rb.velocity;//のように、ジャンプの「速度」を{一定にする}方が良い。
transform.LookAt = そのものがいる[あるいはある]方向(座標)を見る。
敵の座標-自分の座標=その方向の「ベクトル」が入手可能。
ただしこの場合、y方向(高さ)も反映されるので、それは無視させるように設定。
外積は、Vector3 Crossにて「戻り値:Vector3」で帰ってくるので覚える必要なし。
Convert.Tostring(変数,2{8,16でも可})
〇進数 = その進数の数字で割る=> 繰り上げ...の繰り返し。
WhileよりForの方が文が短くなる。
(int)(計算式) = 小数点以下を「切り捨て」可能(int型に変換するため)に。
実際に計算すると「オーバーフロー」するので、危険な場合もある。=その数で割り切れるときにカウントを増やす。
Enumerable.Range(Linq) = ()内の部分を行う。
$を先に入力することで{}内に埋め込んでいる。
Angle = 角度を求める。
内積 = 視野の角度を決めることが可能。
enum = 「変数名 = 数字」と書くことで、後々見やすくなる。(ただし、後々書く際に癖があるので注意!)
char => 文字列(string)から配列のように取り出すことが可能に。
Math.Abs = 絶対値を出すことが可能。
メモ化 = 素数であるかをチェックする際等、プール[メモリ内]の物で割れるかを確認し、入れるか否かを判断して「記録する」ことが可能。
素数 = nが1またはn未満の数で割れない。=> n / 〇。 = 割り切れない
メモ化 = 計算速度が速いが、メモリを食う。
字下げスタイル = C# => オールマンスタイル,C++ K&Rスタイルと決まっている。
0スタート,1スタートはしっかりしよう。
Int.MaxValue = 最大有効数字を出力する。
index番号だけで、stringの引継ぎを行わない。どちらかというと、ListやDicsionaryの方が普通。
スタックとキュー = 配列やリスト等で使用。
キュークラス = 宣言した型をキューの形式で使用。
EnQueue = int系START
DeQueue = int系EIXT
Updateに入れているときれいに処理しない。
=Inputdebaffa キューの動きをしてくれる。(入力したボタンをキューに入れて、先の物が終わったら後々出力する際にその順番に出す。)
スタッククラス = プッシュメソッドで入れて、ポップメソッドで出すことが可能。(先入後出)
Unityのエラー文のなっがい所 = スタックエラー。エラー時の呼び出された変数等を書き出している。
using ジェネリック = Stackというのがあり、pushもpopもできる。
Enqueue = キュー内に入れる。
Dequeue = キューの一番先頭を消去する。
RemoveAt(数) = 数の文字等を削除。
「探索」といっても様々。
⓵幅優先探索
⓶深さ優先探索
の二種類を説明。
検索したいものがある=>どことどこがつながっているか。
⓵:BFS(breadth-first search)とも言う。
まず、「経路については分からない」。
行けるかどうか。結果だけが分かる。
幅優先探索「だけ」では分からない。
追加でメモするものを作っておけば
「最短」で行くことができる物を表すことが可能になる。
キュー内に行ける物を入れて、「次に行ける物一つ」をキューから取り出して、並べる。
この際、一度通っている物はキュー内には入れることはない。
行けないところは取り出さず、消去する。
通った際に行けるところすべてをキュー内に入れ、行けたら取り出し、行けなかったら消去する。
そんな感じ。
ちなみに、キュー内にゴールが出た瞬間にそのゴールを出してゴール。
もし、ゴールが無ければキュー内の全てを削除、行けない。という結果になる。
⓶:DFS(depth-first search)とも言う。
効率は良くない。が、確実に着くことが可能。(〇〇の向きにずっと行く。)
ただし、一度通ったどころにはいかない。
スタックに入れる=>進む=>行くところがあるか確認...の繰り返し。
もし行けるところがないかつゴールでない場合は、ポップ(ひとつ前に戻る)して行けるところがあるか確認...となる。
ちなみに、行ったことがあるかを確認するのは「再帰呼び出し」なので、注意。
こちらは「スタック」を使用する。
Stack.Peekはあまり思いつかない人もいるが、やっているのは同じ(popしてからPushしなおす行為。)
線系探索=>先頭から調べていくだけ=そこまで関係あるとは言えない。ただ「まったく」違うとも言い切れない。
簡単な違いは、可能性の幅が広がるか、確実に行ける場所(深さ)かである。
こういった探索は、「道」(パックマンのように道が複雑な場合)での使用に使える。
が。普通に作るとマス移動しない。ので、グリッド移動(内部でグラフ)にしよう。
こういった場合、「Navigation Meshes」(以降「ナビメッシュ」)を使うのがポピュラー。
ナビメッシュは内部構造的にグラフになっているので、使うと良い。
ちなみに、全く関係ない話だがPaizaでの入力例は馬鹿にできない。
実際に多くの入力例になったり、
めちゃめちゃ大きい数字が出てくることもあるので、
馬鹿にしないこと。イイネ?
GCD = 最大公約数
ユークリッドの互除法は、この最大公約数をaとbで割りあった余りを、今度aとbの大きい方に代入し、割り続けることをいう。
これには「ループ」と「再帰呼び出し」の2種類の方法がある。
再帰呼び出しのほうが実は文が短いので簡単っちゃ簡単。
三つ以上の場合、「読み込む」「計算」のループが必要になる。
平方根の計算(Math.Sqrt)は重いため、できるだけ避ける。
ただし「避けれるなら避ける」のであって、「やるな」ではないので注意。
二分木 = binary Tree
String.Contains = 特定の文字を調べる。
問題を解く際に、「楽」をし過ぎると「何を聞いているのか」を考える必要がある。
double = 小数点
long = 整数
長い者同士ではあるものの、方向性が違うので注意。
余り = modulo,remains
ToUpper = 大文字かどうかを判定
これはシャープではなく、「ナンバー」という言い方をするらしい。
ハッシュ = ある値を数値にしたもの。
オープンアドレス = 配列のまま、被りが無くなるまで再計算する。
チェイン = ハッシュにおける、データのリストにする(追加していく)。
どちらにせよ「メモリ」を多く必要とする。
しかし、「{多い}メモリの中から、その要素を{素早く}見つける。」
めっちゃ出てくるので覚えること。
Enumerable.Repeat => 0以外で初期化する。
0オリジン = 0スタートのこと。(始まり)こっちの言い方がおすすめ。
C++はプッシュバックは後ろにつける。ポップバックは後ろを取る。といった、関数があるがC#ではクラスがある。
C#は初期値が0。
Enumerable.Repaet = (初期値,要素数)
HashSet = 重複を「含まない」。入れたとしても勝手に抜かれる。(Collections.Generic)
” = string
’ = char
ケースによってやり方の最善は異なる。
Enumerable.Union = 複数の数字を引数に与える。
IEnumerable = 一つの要素にいっぱいの物がある。
List <型> 変数 = new List<型> {配列,配列~};
Lengthの実態=>Arrayクラスのプロパティ
foreach(var 要素変数 in 配列){}
配列の要素を取り出して先頭から末尾まで繰り返す
indexser => 数字を入れると、その文字目の文字を出す。(String)
stringとstring[]では、配列時の挙動は異なる。
foreach => 機能自体は、別の機能を同時に行っているため、「foreach」という名前でランタイム上に記録は残らない。
空のブロック{}を使って変数の被りを避けることが可能。」
LinkedListNode = 配列になった際、選択中と左右のみ選べるように作る。
Randamには向かない。
配列と言ってもさまざまなことが多いので、考えること。
/// summaryになる(コードで見た際、自分で作った「変数」や「関数」はこれで書くことで、このコードについてのメモとして使用できる。)
を使用して、summary内の詳細を説明する方が良い
関数の「Try~」と名前が鳴っている場合、bool型になっているので注意。
tryとcatchを使うと、tryの中でエラーが起こった際に、catch内でのことをやってくれるもの。
基本的には、falseやエラーを作って返すのが基本だそう。
nullチェックを忘れるとエラーが出るので、if(〇〇 == null){continue;}が必要になってくる。
ちなみに、nullチェックは忘れやすいので注意が必要。
パラメータには「out」がある。
出力用パラメータで、これは終わるまでに変数が返されないとエラーが出る。
呼び出す方は、変数を用意する必要がある。
outはif文に書いた際、なぜか外側まで使用できるので注意。マジ怖い。
TryGetComponentもあるので、nullチェックに(・∀・)イイネ!!。
[RequireComponent(Typeof())]これがあると、()のコンポーネントを消そうとするとエラーが出る。これないと動かないゾって時に使用する。
「out」の他に 「ref」 パラメータがある。
refは「参照渡し」なので、上書きが可能。
(ref 変数)で使用可能に。
ただし初期化が必要。渡すためにあるので中身が元から入っている物に入れて渡すわけにはいかない。
また、書き換えられないために型のようにrefが必要
outは「書き込み用の参照」を受け取るので初期化されてなくてもOK。
こちらにも制約がある。
必ず、「中身が決まっていなければならない」。
中身が無しでは通れない。
それぞれ条件があるが、読み書きするなら[ref],書き込みのみ[out]
なら、読み取りは? => [in]
...普通。
「in」は読み取り専用。
なので、上書き不可。
出すときは、定数OK,変数OKただし、中身が変わることはないのでスルー。
inは書き換えられない(読み取り専用なので)ので、型のようにinは書かなくてok
inやrefのある意味=>コピーの削減によるパフォーマンスの容量削減。
今はinがあるものの、昔はなかったので大変。
参照は64bitなので、まあまあ重いがそれほどの多さの物も軽ーく運べるので楽。
refは使用に注意が必要なので、「書き換えOK」なら使用することも。
何回も、巨大な物をコピーをするくらいなら使用するけど。