C#＆Unityガチ初心者のガチ初心者によるガチ初心者のための備忘録

Unityで開発を始めたんですが、マジで初歩的なことがわからへんということで
ちまちま追記予定。

バージョン情報
C#：9.0
Visual Studio：17.11.2
Unity：2022.3.42f

---

## 「CS0236」フィールド初期化子は、静的でないフィールド、メソッドまたはプロパティの “名前" を参照できません。

--2024/9/10--

他に詳しく解説しているサイトもあるけれども

```言語:C#：CS0236
using UnityEngine;
using Fade;

public class Test : MonoBehaviour
{
    [SerializeField] private GameObject startButton;

    Fading fade = startButton.AddComponent<Fading>();　//＜＝　CS0236発生
    fade.FadeOut();

    void Start()
    {
        Fading fade = startButton.AddComponent<Fading>();　//＜＝　こちらは無事
        fade.FadeOut();
    }
}
```
クラス直下メソッド外での記述がダメらしい。

ついでに上の
```
startButton.AddComponent<Fading>();
```
という記述について

startButton　＝＞　[SerializeField]で直接指定されたオブジェクト
Fading　＝＞　オブジェクト配下でなんやかんやされるコンポーネント

オブジェクトがこういうやつで↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/3485af97-394c-1ef9-5b5d-c64299d988eb.png)

コンポーネントがこういうやつ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/be055797-f432-9574-af12-bcbe37a453b6.png)

なので、
```
Image image = startButton.GetComponent<Image>();
```
と書いて、中身の画像だったり色だったり透明度だったりをスクリプトからいじることができる。
ようするにインスペクターの中身はC#から全部いじれる、はず。例外は知らないですすいません

---

## DontDestroyOnLoadについて

--2024/9/22--

他のオブジェクトにアタッチしているスクリプトからの指定は無効っぽい。
対象オブジェクト直下にスクリプトをぶち込まないと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/a21bf0c0-3d27-dc45-4ed5-a38eb4ef05a5.png)

こいつが作られることもなく、もちろんシーン間移動の際に消滅してしまう。

---

## コンポーネントのImageについて

--2024/9/24--

例えば以下のようなオブジェクトがあったときに、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/224e3da7-b5a8-2e37-bd1d-49f20a47831c.png)

setActive = true, enabled = true
のときのみ、それ以背のオブジェクトが反応しなくなる。

逆に言えば、Imageだけ非アクティブ化するコードであれば基本的にめんどくさくなさそう。

---

## Fungus - InvokeMethodについて

--2024/9/22--

InvokeMethodを使用した際、

```言語:C#
Error : Exception has been thrown by the target of an invocation.
```
というエラーが出たことがある。ちょっと前まで動いてたし、ここから飛べるエラー発生源を見てもFungusのファイルなので違うはず。

なんで起こっとる？？？はぁ？？？（半ギレ）
となっていたところ、InvokeMethod.cs内部のエラーを吐くコードが↓

```言語:C#
Debug.LogError("Error: " + ex.Message);
```

「Message」・・・？妙だな・・・。まさか・・・。

```言語:C#
Debug.LogError("Error: " + ex); //エラー全容判明
```

エラー隠ぺいしてんじゃねぇ！！！全部吐けオラッ！！！（全ギレ）

となりましたので、同じようなエラーに遭われた方はお試しください。
あ、場所は　Assets\Fungus\Scripts\Commands\InvokeMethod.cs　です。

---

## シーン遷移後のカーソルについて

--2024/9/23--

カーソルを自分で用意したものに変更した後、シーン遷移をしたいとする。

Additiveでもない限り、当然遷移前のシーンおよび各情報は破棄されるので、カーソルも同じく破棄されてしまう。

ので再度Startなりなんなりで、初期のカーソルの設定をし直す必要がある。
冷静に考えればそりゃそうなんだけどね・・・２時間近く悩んだよね・・・。

---

## ScriptableObject - CustomEditorについて

--2024/9/24--

理想はこうだとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/03d64d15-868b-054a-a709-e77380122bea.png)

の時に、
```:C#
playerFoldout = EditorGUILayout.Foldout(playerFoldout, "プレイヤー");
zonbieFoldout = EditorGUILayout.Foldout(zonbieFoldout, "ゾンビ");

if (playerFoldout)・・・
if (zonbieFoldout)・・・
```
と連続して書くと、全部一緒くたになってしまうので

```:C#
playerFoldout = EditorGUILayout.Foldout(playerFoldout, "プレイヤー");
if (playerFoldout)・・・

zonbieFoldout = EditorGUILayout.Foldout(zonbieFoldout, "ゾンビ");
if (zonbieFoldout)・・・
```

こう書かないといけない。

えっ見づらい？私もそう思います。

---

## ScriptableObjectの概念について

--2024/9/26--

おそらく書き方とかはご存じだろうからガッツリ割愛。

ScriptableObject内部の変数は、「static」や「const」は使えない。

おそらくScriptableObject自体が非プログラマでも内部データをいじくれるようにするための機能なので

⇒　インスペクタからガリガリ書き換えられるようにしたい
⇒　静的や定数である意味イズ何

・・・という概念になってるものと思われる。全然違ったらスミマセン。

---

## Fungus - Globalについて

--2024/10/01--

「Fungus」について。
複数シーンでの開発時に、「この変数初期化したくないなぁ～」ってなるときありますよね。あるんですよ。あれ。

そんなときに使うのがFlowChart⇒Variables⇒Globalです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/07fab7b2-2622-6d99-5f90-f16b79a9dc0f.png)

Globalを指定しておけば、他シーンに移った時でも変数の中身が破棄されずに残り、どこからでも参照できる状態になります。バコバコ使いまわせますね。

---

## （再）Fungus - InvokeMethodについて

--2024/10/10--

「Invoke Method」という、C#の関数を呼び出せるものがあるんですが、どうやら可変長引数
```:例
params int[] i #とか
```
は扱えないみたいです。大人しく固定させときましょう。

---

## アニメーションクリップのLegacy化について

--2024/10/20--

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/7164ad6d-633c-a4a6-be7a-6a726ed7820c.png)

インスペクターの真横の、３つの点をクリック。
その後「Debug」を選択、ウィンドウが「Inspector」から「Debug」に変わるので、その中からLegacyに変更する。

---

## C＃自体の仕様（if - else）について

--2024/10/20--

```:C#
if ()
{
    //なんか処理
}
if ()
{
    //なんか処理できない！！！
}
else 
{
    //なんか処理
}
```
のように書くと、二つ目のif文はガン無視される。初めて知った。。。
いつも
if (){}
if (){}
みたいに並べて書いてたから行けると思ってたら見事にハマった。悔しい。

---

## updateとwhileの関係について

--2024/10/26--

updateは1フレームごとに処理をするもの、whileは条件に沿うとき処理をするもの。

~~・・・なんだけど、どうも相性が悪い。trueになる条件を設定してもfalseになる条件を設定してもUnityが完全にフリーズする。~~

~~おそらく
updateが走る⇒whileが走る⇒1フレーム後に再update⇒while初期化
という流れで無限ループに入ってると思われる。検証もなにもしてないから詳細はシラネ。~~

~~これで無下限やってんの腹立つな。~~

上記に追記。update関係なかったかも。

```C#:失敗例
Vector3 pos = Vector3.MoveTowards(transform.position, targetPosition, Time.deltaTime * 300);

while (Vector3.Distance(targetPosition, transform.position) > 0f)
{
    cardRT.position = pos;
}
```
while内部に「pos」変数を入れると死亡する。

```C#:成功例
//変数なんていらんかったんや
//Vector3 pos = Vector3.MoveTowards(transform.position, targetPosition, Time.deltaTime * 300);

while (Vector3.Distance(targetPosition, transform.position) > 0f)
{
    cardRT.position = Vector3.MoveTowards(transform.position, targetPosition, Time.deltaTime * 300);
}
```
直挿しするとイケる。正直イミワカラン。有識者教えてください。

---

## RenderTextureについて

--2024/10/31--

```
Releasing render texture that is set to be RenderTexture.active!
```

いやRenderTextureも使てへんし、その辺りでエラー起こるような組み方してへんけど！？

とは思いましたが出るのでしょうがない。

```:C#
RenderTexture.active = null;
```
ようするに「もうやめて！RenderTextureのライフはゼロよ！！！」なので、慈悲をもって息の根を止めることをお勧めします。

---

## 画面サイズおよび座標について

--2024/11/06--

結論から書くと、少なくともScreenSpace - OverLayにしているとき、画面サイズ＝座標になるということ。

ウィンドウサイズを変えたときに、配置する座標計算を足し算でごまかしてると、私みたいに痛い目にあうのでご注意を。
まあ比率だからね、はなっから掛け算でやれやと言われればぐうの音もでませんが。