Unity 2Dゲーム作成時 備忘録

随時追記
## アスペクト比とCanvasの設定 (最初に行う)
* [Game]ビューで画面のアスペクト比を選択（無い場合は自分で入力して設定）
* [Create]>[UI]>[Canvas]
* CanvasのInspector
    * [RenderMode]を[ScreenSpace-Camera]にしてMainカメラをD&D
    * [CanvasScaler(Script)]の[UI Scale Mode]>[Scale With Screen Size]にして、上記のアスペクトに変更
    *  [ScreenMatchMode]を[Expand]に変更

https://www.youtube.com/watch?v=ZlwwiLb0NXE&list=PLuDnKRQ4VWHOKViVca7XnDJ_jnaf4CGe4&index=1

https://www.youtube.com/watch?v=urEAxuisHM4

## フォルダ構成例
* [Prefabs]
* [Resources]
    * [Images] 
* [Scenes]
* [Scripts]


## オブジェクトに重力を付ける
Rigidbody2D

## 当たり判定
collider

※タイルマップは以下
tilemap collider

## Unityにログ出力
```c#
Debug.Log("test");
```

## ゲームオブジェクトの取得
方法1.Findで取得。ただし、そのオブジェクトが非アクティブの際は失敗しNullが返る
```cs
public GameObject GO;
GO=GameObject.Find("GameManager")
```
方法2.publicで宣言し、unityのインスペクターでアタッチする。


## オブジェクト非表示
```cs
GameObject.GetComponent<SpriteRenderer>().enabled=false;
```
GameObject.SetActive(false)だとfindで失敗する。

## 他のオブジェクトにアタッチしたscriptのデータを取得
FindでGameManagerオブジェクトのscriptコンポーネント(GameManager.cs)を探し、
String型のtestを参照する例。
```c#
    public GameManager GM;
    void Start()
    {
        GM=GameObject.Find("GameManager").GetComponent<GameManager>();
        String test =GM.test;
    }
    
```



## imegeのスプライト変更例
1．GameManagerというクラスにあらかじめ、public Sprite[] itemSprite と宣言して、
unityのインスペクターにアタッチしておく。
2.下記コマンドでTargetGameObjectのImageのspriteを変更する。
```cs
TargetGameObject.GetComponent<Image>().sprite= GM.itemSprite[0];
```


## sprite と image 使い分け
>uGUIは動かすことを余り想定していない
動かさなければ、低負荷 低消費電力
uGUIはCanvas単位で動かす
Spriteは動かすことを前提
沢山描画する場合に対して最適化
といった方針が見えます。
>>動かさないがα0の範囲が大きいならSprite Renderer
（但し、矩形できれいに抜ける場合はその限りではない）
スプライトを常に大量に動かすならSprite Renderer
オーバードローが多いならSprite Renderer
画像を絶対に動かさないならuGUIのImage
小さいスプライトを一部動かすならuGUIのImage
（動かすImageは別途Canvas必須）

引用元： https://tsubakit1.hateblo.jp/entry/2016/09/26/080000

## spriteにbuttonコンポーネントを追加時の注意点
imageコンポーネントも追加しないとclick処理が実行されない。
参考：https://forum.unity.com/threads/button-component-on-sprite-object.285765/
### imageコンポーネントのrange
Raycast Paddingでrangeの調節可能

## BGM設定
オブジェクトを選択し、AddComponent >Audio>AudioSourceでアタッチ
AudioClipでファイルを指定

## BGMの止め方
```cs
GetComponent<AudioSource>().Stop();
```

## 効果音
同じくAudioSourceクラスのPlayOneShotメソッドでAudioClip型の音源ファイルを1回再生できる。
```c#
  AudioSource audioSource;
  public AudioClip sound1;
  void Start()
    {
        audioSource = GetComponent<AudioSource>();
        audioSource.PlayOneShot(sound1);
    }
```
参考URL:https://www.sejuku.net/blog/83535



## Font 変更
対応フォント形式(.ttf .otf)をダウンロードし、Assetsフォルダに入れる。
ダウンロード可能サイト：http://modi.jpn.org/
参考URL：https://www.sejuku.net/blog/83669

## UIが画面から見切れないように設定する
・Screen Match Mode

・Match Width or Height
UI要素の縮小を、縦を基準にするか、横を基準にするか設定可能

・Expand
UI要素が画面から絶対に見切れないように、縦横に伸縮。

・Shrink
描画位置がUIの範囲外を映さないように、UIをトリミングして表示。背景画像に有効。

参考URL:https://torampo.com/?p=87

## world座標の取得
```cs
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
```
要MonoBehaviourクラスの継承
Camera.main : MainCameraタグが付いたカメラを取得

## レイヤーマスクの取得方法
```cs
LayerMask.GetMask("マスク名");
```
レイヤーマスク：タグ名のこと。
要MonoBehaviourクラスの継承

## クリックでオブジェクトを検知
検知させたいオブジェクトにはRigitBody2DとBoxCollider2Dをアタッチしておく。

```cs
	void Update()
	{
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		//Rayの長さ
		float maxDistance = 10;
		RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction, maxDistance);
		
		//右クリックして、Raycastがnullじゃない(オブジェクト)と衝突したら処理をする。
		if(Input.GetMouseButtonDown(0) && hit.collider){
			//処理
			Debug.Log(hit.collider.gameObject.name);
		}
	}
	
	//参考： https://kan-kikuchi.hatenablog.com/entry/RayCast4
	

		//RigitBody2DのBodyTypeはStatic設定
		
		//Dynamic
		//物理演算で移動するオブジェクト
		
		//Kinematic
		//スクリプトで動かすオブジェクト
		
		//Static
		//原則移動しない、稀に再配置もしくはOn・OFFするオブジェクト
		
		//Rigidbody2d無し
		//動かさない。
```