Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

Äɲ䵤줿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
ºï½ü¤µ¤ì¤¿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£

¡¡NavMeshComponents ¤È NavMeshAgent ¤òÍøÍѤ·¤¿·ÐÏ©°ÜÆ°½èÍý¤Î¼ÂÁõÎã¤Ç¤¹¡£
£²¥Ñ¥¿¡¼¥ó¤Î¼ÂÁõÎã¤ò£²¤Ä¤Î¼ê½ç¤Ëʬ¤±¤Æ²òÀ⤷¤Þ¤¹¡£

¡¡¤³¤Î¼ê½ç¤Ë¤ª¤¤¤Æ¤Ï¡¢¥²¡¼¥àÆâ¤Ç¾ã³²Êª¤¬Æ°Åª¤ËÀ¸À®¤µ¤ì¤¿¥¿¥¤¥ß¥ó¥°¤Ç¤ÎºÆ Bake ¤Ç¤Ï¤Ê¤¯¡¢
''¾ã³²Êª¤È¥¨¡¼¥¸¥§¥ó¥È¤¬ÀÜ¿¨¤·¤¿¥¿¥¤¥ß¥ó¥°¤ÇºÆ Bake ¤ò¹Ô¤¤¡¢·ÐÏ©¤¬ÊѲ½¤¹¤ë''¥±¡¼¥¹¤Î¼ÂÁõÎã¤Ç¤¹¡£


&ref(https://image02.seesaawiki.jp/i/o/i-school-memo/xiHcGoPAFT.gif, 50%)

----

&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/SrIyVRtOxk.gif, 50%)


¡¡¾åµ­¤ÎÆ°²è¤Î¤è¤¦¤Ë¡¢¾ã³²Êª¤È¥¨¡¼¥¸¥§¥ó¥È¤¬ÀÜ¿¨¤·¤¿¥¿¥¤¥ß¥ó¥°¤Ç¿·¤·¤¤·ÐÏ©¤ÎºÆ·×»»¤ò¹Ô¤¤¡¢ÌÜŪÃϤòÌܻؤ¹µ¡Ç½¤Ç¤¹¡£

----

*Àß·×

¡¡NavMeshComponents ¤Ï£²£Ä¤Ç¤Î NavMesh µ¡Ç½¤Î³èÍѤΤۤ«¡¢¥²¡¼¥àÆâ¤Ç¤ÎưŪ¤Ê Bake ¤ò¼«Æ°Åª¤Ë¹Ô¤¦µ¡Ç½¤¬¤Ä¤¤¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ï¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤éÀßÄê²Äǽ¤Ç¤¹¡£

¡¡¤³¤Á¤é¤Îµ¡Ç½¤òÍøÍѤ¹¤ë¤È¡¢Î㤨¤Ð¾ã³²ÊªÍѤΥª¥Ö¥¸¥§¥¯¥È¤¬À¸À®¤µ¤ì¤¿¤ê¡¢°ÜÆ°¤·¤¿¤ê¤¹¤ë¤È¡¢
¨ºÂ¤Ë Bake ¤Î¥ê¥Ó¥ë¥É(¥ê¥Ù¥¤¥¯)¤¬Áö¤ê¡¢Bake ÈϰϤò¹¹¿·¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£
¤è¤Ã¤Æ¡¢¤½¤Î¿·¤·¤¤ Bake ¤µ¤ì¤¿ÈϰϤòÍøÍѤ·¤Æ¡¢¿·¤·¤¤·ÐÏ©·×»»¤¬¹Ô¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

¡¡¤¿¤À¤·¡¢¤³¤Îµ¡Ç½¤òÍøÍѤ·¤¿¾ì¹ç¡¢¥¨¡¼¥¸¥§¥ó¥È¤Ï¾ã³²Êª¤ËÀÜ¿¨¤·¤Ê¤¯¤Æ¤â·ÐÏ©Êѹ¹¤¬È¯À¸¤·¤Þ¤¹¡£
¤½¤Î¤è¤¦¤Ê¾õ¶·¤¬¹¥¤Þ¤·¤¯¤Ê¤¤ = ''¤¤¤º¤ì¤«¤Î¥¨¡¼¥¸¥§¥ó¥È¤¬¾ã³²Êª¤ËÀÜ¿¨¤·¤Æ½é¤á¤Æ·ÐÏ©Êѹ¹¤¬Æþ¤ë¤è¤¦¤Ë¤·¤¿¤¤''¡¢¤È¤¤¤¦¥±¡¼¥¹¤òÁÛÄꤷ¤¿¼ÂÁõÎã¤Ë¤Ê¤ê¤Þ¤¹¡£

----

*»öÁ°½àÈ÷¤È Bake

¡¡»öÁ°¤Î½àÈ÷¤È¤·¤Æ¤Ï¡¢''%%%[[¡Ú£²£Ä¡ÛNavMeshComponents ¤òÍøÍѤ·¤¿·ÐÏ©°ÜÆ°½èÍý¤Î¼ÂÁõÎã­¡>¡Ú£²£Ä¡ÛNavMeshComponents ¤òÍøÍѤ·¤¿·ÐÏ©°ÜÆ°½èÍý¤Î¼ÂÁõÎã­¡]]%%%''¤Î³Ø½¬¤È¼ÂÁõ¤¬½ªÎ»¤·¤Æ¤¤¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£

¡¡²¼µ­¤Î»²¹Í²èÁü¤Î¤è¤¦¤Ë¡¢¥¿¥¤¥ë¥Þ¥Ã¥×¾å¤Ë°ÜÆ°²Äǽ¤Ê¥ë¡¼¥È¤¬ Bake ¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò³Îǧ¤·¤Æ¤¯¤À¤µ¤¤¡£


&ref(https://image02.seesaawiki.jp/i/o/i-school-memo/0ojzhAzkUH.png, 50%)


&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/4hrno5A1Dl.png, 50%)


¡¡²èÌ̱¦Ã¼¤Î¹õ¤¤Éôʬ¤¬ÌÜɸÃÏÅÀ¤Ç¤¹¡£


&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/biC6LYLN5p.png, 50%)

----

*NavMeshBuilder2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ÎÀßÄê

¡¡Update Method ¤ÎÀßÄê¤ò ''Manual ¤ËÀßÄê''¤·¤Æ¤ª¤¯¤³¤È¤Ç¡¢
¥²¡¼¥à¼Â¹ÔÃæ¤Ë¤ª¤¤¤Æ¡¢¾ã³²Êª¤Ê¤É¤¬Äɲ䵤줿¤ê°ÜÆ°¤·¤¿¾ì¹ç¤Ç¤¢¤Ã¤Æ¤â¼«Æ°Åª¤Ë¤ÏºÆÅÙ Bake ¤¬¹Ô¤ï¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£


''¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü''
&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/KcQOqmr86d.png, 35%)


¡¡Update Async ¤Ë¥Á¥§¥Ã¥¯¤òÆþ¤ì¤Æ¤ª¤¯¤È¡¢ÆâÉô¤Ç AsyncOperation ¥¯¥é¥¹¤òÍøÍѤ·¤¿ÈóƱ´ü½èÍý¤Ë¤è¤ë Bake ¤¬¹Ô¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
(¤¿¤À¤·¡¢AsyncOperation ¤¬ private ¤Ê¥á¥ó¥ÐÊÑ¿ô¤Ç¤¢¤ë¤¿¤á¡¢³°Éô¤«¤é¤Î³èÍѤ¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ï¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó¡£)

¡¡¤³¤Á¤é¤â´ðËÜŪ¤Ë¤Ï¥Á¥§¥Ã¥¯¤ÏÉÔÍפǤ¹¡£

----

*¾ã³²ÊªÍѤΥª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®

¡¡Ç¤°Õ¤ËºîÀ®¤·¤Æ¤¯¤À¤µ¤¤¡£

¡¡²¼µ­¤Ï¥µ¥ó¥×¥ë¤Ç¤¹¡£


''¥µ¥ó¥×¥ë²èÁü''
&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/s8UoZb5dLL.png, 35%)


''¥µ¥ó¥×¥ë²èÁü''
&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/5bw7XNjqsS.png, 35%)

----

¡¡NavMeshSourceTag2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥¢¥¿¥Ã¥Á¤·¡¢Area ¤ò 1 ¤ËÀßÄꤷ¤Þ¤¹¡£
½é´üÀßÄê¤Ç¤Ï 1 ¤ËÀßÄꤹ¤ë¤³¤È¤Ç¡¢''Bake »þ¤Ë·ÐÏ©Âоݤ«¤é½ü³°¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È(¾ã³²Êª°·¤¤)''¤Ë¤Ê¤ê¤Þ¤¹¡£

¡¡³°Éô¤«¤é¤ÎÀÜ¿¨È½Äê¤ËÂбþ¤Ë¤¹¤ë¤¿¤á¡¢Tag ¤ò Wall ¤ËÀßÄꤷ¤¿¾å¡¢
¥ª¥Ö¥¸¥§¥¯¥È¤Î·Á¾õ¤Ë±þ¤¸¤¿£²£ÄÍÑ¥³¥é¥¤¥À¡¼¤È Rigidbody2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥¢¥¿¥Ã¥Á¤·¤Æ¤¤¤Þ¤¹¡£

¡¡³°Éô¤«¤é¤ÎÀÜ¿¨¤Ç¾ã³²Êª¤¬°ÜÆ°¤·¤Ê¤¤¤è¤¦¤Ë¡¢Freeze Position ¤ä Freeze Rotation ¤Î¥Á¥§¥Ã¥¯¤òÆþ¤ì¤Æ¤ª¤¤¤Æ¤â¤è¤¤¤Ç¤·¤ç¤¦¡£

¡¡Å¬µ¹¡¢¼«Ê¬¤Î¥×¥í¥¸¥§¥¯¥È¤Ë¹ç¤ï¤»¤ÆºîÀ®¤·¤Æ¤¯¤À¤µ¤¤¡£


&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/4LprYPAlMe.png, 35%)


¡¡¥×¥ì¥Ï¥Ö¤Ë¤·¤Æ¤ª¤¯¤³¤È¤ÇưŪÀ¸À®¤ËÂбþ¤Ç¤­¤Þ¤¹¡£
¤Þ¤¿ÀìÍѤΥ¯¥é¥¹¤ò¥¢¥¿¥Ã¥Á¤·¤Æ¤ª¤¯¤È¡¢¾ã³²Êª¤ÎµóÆ°(²èÁü¤Îº¹¤·Âؤ¨¡¢Âѵ×ÎÏÀßÄê¤Ê¤É)¤âÀ©¸æ¤Ç¤­¤Þ¤¹¡£

----

*¾ã³²ÊªÍѤΥª¥Ö¥¸¥§¥¯¥È¤Î²¾ÇÛÃÖ

¡¡ºîÀ®¤·¤¿¾ã³²ÊªÍѤΥª¥Ö¥¸¥§¥¯¥È¤ò Bake ¤µ¤ì¤Æ¤¤¤ë·ÐÏ©¤Î¾å¤ËÇÛÃÖ¤·¤Æ¤¯¤À¤µ¤¤¡£
NavMeshBuilder2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î Bake On Enable ¤Ë¥Á¥§¥Ã¥¯¤¬Æþ¤Ã¤Æ¤¤¤Æ¤â
Update Method ¤ò Manual ¤ËÀßÄꤷ¤Æ¤¤¤ë¾ì¹ç¡¢¥¨¥Ç¥£¥¿¡¼¾å¤Ç¤â¡¢¥²¡¼¥à¼Â¹Ô»þ¤Ë¤ª¤¤¤Æ¤â¼«Æ°Åª¤Ë¤Ï Bake ¤¬¼Â¹Ô¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£


&ref(https://image02.seesaawiki.jp/i/o/i-school-memo/xiHcGoPAFT.gif, 50%)

----

¡¡¾ã³²Êª¤ò·ÐÏ©¤ËÈ¿±Ç¤·¤¿ÆâÍƤò³Îǧ¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¼êÆ°¤Ç Bake ¥Ü¥¿¥ó¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡£
¾ã³²Êª¤È¤·¤Æǧ¼±¤µ¤ì¤ë¤È Bake ÆâÍƤ¬¹¹¿·¤µ¤ì¤¿¤È¤­¤Ë¾ã³²ÊªÃÏÅÀ¤Î·ÐÏ©¤¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£


&ref(https://image02.seesaawiki.jp/i/o/i-school-memo/bnI92pjJuf.png, 50%)

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡''¢­''

&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/y4jMfsTUWJ.png, 50%)


----

¡¡NavMeshAgent ¤Îµ¡Ç½¤È¤·¤Æ¡¢ÌÜŪÃϤ¬ÊѤï¤é¤Ê¤±¤ì¤Ð¥ë¡¼¥È¤òºÆ·×»»¤·¤ÆÌÜŪÃϤòÌܻؤ·¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢¥²¡¼¥àÆâ¤ÇưŪ¤Ë Bake ¤¬¼Â¹Ô¤µ¤ì¤ì¤Ð¡¢¥¨¡¼¥¸¥§¥ó¥È¤ÎÌÜŪÃϤޤǤηÐÏ©¤Ï¥²¡¼¥àÆâ¤Ç¤â¼«Æ°Åª¤ËÊѤï¤ê¤Þ¤¹¡£


&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/SrIyVRtOxk.gif, 50%)

----

*¥×¥í¥¸¥§¥¯¥È¤Ø¤ÎƳÆþ

¡¡¥¿¥ï¡¼¥Ç¥£¥Õ¥§¥ó¥¹¤Î¶µºà¤ò¥Ù¡¼¥¹¤Ë¥µ¥ó¥×¥ë¥³¡¼¥É¤âÄ󼨤·¤Þ¤¹¡£
Á°Äó¤È¤·¤Þ¤·¤Æ¡¢¶µºà¤Î´ðÁÃÉôʬ¡Ê¥¿¥ï¡¼¥Ç¥£¥Õ¥§¥ó¥¹¤Î¼ê½ç£±¡Á£²£¸¤Þ¤Ç¡Ë¤ò¼ÂÁõºÑ¤Î¾õÂ֤ǤÎƳÆþ»öÎã¤Ë¤Ê¤ê¤Þ¤¹¡£


----

**¡ãEnemyController¡ä

¡¡Å¨¤Î°ÜÆ°½èÍý¤ò DOTween ¤«¤é NavMeshAgent ¤ËÃÖ¤­´¹¤¨¤¿¾ì¹ç¤Î¥µ¥ó¥×¥ë¥³¡¼¥É¤Ç¤¹¡£

¡¡NavMeshAgent ¤Îµ¡Ç½¤òÍøÍѤ¹¤ë¤¿¤á¡¢using ¤Ë UnityEngine.AI ¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£

¡¡¿·¤·¤¤ SetUpEnemyController ¥á¥½¥Ã¥É¤òºîÀ®¤·¡¢°ú¿ô¤òÊѤ¨¤ë¥ª¡¼¥Ð¡¼¥í¡¼¥Éµ¡Ç½¤òºÎÍѤ·¤Æ¤¤¤Þ¤¹¡£
¤Þ¤¿Ìá¤êÃͤò»ý¤¿¤»¤Æ¤¤¤Þ¤¹¡£

¡¡¤½¤Î¤Û¤«¤Ë¤â NavMeshAgent ¤òÍøÍѤ¹¤ë¤¿¤á¤ÎÊÑ¿ô¤ä¥á¥½¥Ã¥É¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£

''EnemyController.cs''
[+] <= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤­¤Þ¤¹¡£
=|BOX|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using System.Linq;
using UnityEngine.AI;¡¡¡¡//¡¡¡ù¡¡Äɲä·¤Þ¤¹


public class EnemyController : MonoBehaviour
{
[SerializeField, Header("°ÜÆ°·ÐÏ©¤Î¾ðÊó")]
private PathData pathData;

[SerializeField, Header("°Üư®ÅÙ")]
private float moveSpeed;

[SerializeField, Header("ºÇÂçHP")]
private float maxHp;

[SerializeField]
private float hp;

[SerializeField,Header("Ũ¤Î¹¶·âÎÏ")]
public float attackPower;

private Tween tween;

private Vector3[] paths;

private Animator anim;¡¡¡¡¡¡¡¡¡¡¡¡ // Animator ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¼èÆÀÍÑ


////*¡¡¿·¤·¤¤ÊÑ¿ô¤ÎÄɲá¡*////


private NavMeshAgent agent;
private Vector2 agentTargetPos;
private int currentCornerIndex;
private NavMeshBuilder2D navMeshBuilder;

[SerializeField] float agentMoveSpeed = 1.0f;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


public void SetUpEnemyController(Vector3[] pathsData)
{
hp = maxHp;

// Animator ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¼èÆÀ¤·¤Æ anim ÊÑ¿ô¤ËÂåÆþ
//out a b => a¤Ï¼èÆÀ¤·¤¿¤¤¥³¥ó¥Ý¡¼¥Í¥ó¥È¡¢b¤Ï¼èÆÀ¤·¤¿¾ðÊó¤ò³ÊǼ¤¹¤ëÊÑ¿ô
//º£²ó¤Ï¤¢¤é¤«¤¸¤á Animator anim ¤ÈÀë¸À¤·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î»ØÄê¤ò¾Êά¤Ç¤­¤ë
TryGetComponent(out anim);

// °ÜÆ°¤¹¤ëÃÏÅÀ¤ò¼èÆÀ
//pathData¤ÎpathTranArray¤Î³ÆÍ×ÁǤ«¤éposition¤ÎÃͤò¼è¤ê½Ð¤¹
//ToArray¤Ç¼è¤ê½Ð¤·¤¿ÃͤòÇÛÎó²½(paths[]¤Î¾õÂÖ)
paths = pathsData;

// ³ÆÃÏÅÀ¤Ë¸þ¤±¤Æ°ÜÆ°¡£º£¸å¤³¤Î½èÍý¤òÀ©¸æ¤¹¤ë¤¿¤á¡¢Tween ·¿¤ÎÊÑ¿ô¤Ë DOPath ¥á¥½¥Ã¥É¤Î½èÍý¤òÂåÆþ¤·¤Æ¤ª¤¯
//DOPath(x,y) => Âè1°ú¿ôx¤òÌÜŪÃÏ¡¢Â裲°ú¿ôy¤Ï°ÜÆ°¤Ë¤«¤«¤ë»þ´Ö
tween = transform.DOPath(paths, 1000 / moveSpeed).SetEase(Ease.Linear).OnWaypointChange(ChangeAnimeDirection);// <= DOPath ¤Î½èÍý¤ò tween ÊÑ¿ô¤ËÂåÆþ¤·¤Þ¤¹

// °ÜÆ°¤ò°ì»þÄä»ß
PauseMove();
}


////*¡¡¿·¤·¤¤¥á¥½¥Ã¥É¤ò£±¤ÄÄɲá¡*////


public NavMeshPath SetUpEnemyController(Vector2 agentTargetPos, NavMeshBuilder2D navMeshBuilder) {
this.agentTargetPos = agentTargetPos;
this.navMeshBuilder = navMeshBuilder;

hp = maxHp;

TryGetComponent(out anim);

// NavMeshAgent ¤ò¼èÆÀ¤Ç¤­¤ë¤«È½Äꤹ¤ë¡£¼èÆÀ¤Ç¤­¤¿¾ì¹ç¤Î¤ß¡¢if ʸÆâ¤Î½èÍý¤ò¹Ô¤¦
if (TryGetComponent(out agent)) {

// ¥¤¥ó¥¹¥¿¥ó¥¹Âбþ¡£¤³¤³¤Ç NavMeshAgent ¤òÍ­¸ú²½¤¹¤ë¡£»öÁ°¤ËÆþ¤ì¤Æ¤ª¤¯¤È¡¢Bake ¤·¤Æ¤¤¤ëÃÏÅÀ¤òǧ¼±¤Ç¤­¤º¤Ë¥¨¥é¡¼¤Ë¤Ê¤ë¤¿¤á
//agent.enabled = true;

// 3D ÍѤÎÀßÄê¤ò¥ª¥Õ¤Ë¤¹¤ë¡£2D ¤Ê¤Î¤Ç¡¢¤³¤Î½èÍý¤¬¤Ê¤¤¤È¡¢Position ¤È Rotatino ¤ÎZ ¼´¤¬ÊѤʰÌÃ֤˾¡¼ê¤Ë°ÜÆ°¤·¤Æ¥²¡¼¥à²èÌ̤Ëɽ¼¨¤µ¤ì¤Ê¤¤
agent.updateRotation = false;
agent.updateUpAxis = false;

// ½é´üÌÜŪÃÏÀßÄê(¤³¤ì¤¬¤Ê¤¤¤È½é´üÀ¸À®°ÌÃÖ¤«¤é¥º¥ì¤ë)
agent.destination = transform.position;

agent.autoRepath = false;

// ÌÜɸÃÏÅÀÀßÄê
SetRoute();

// °Üư®ÅÙ¤ÎÀßÄê
agent.speed = agentMoveSpeed;

// ·ÐÏ©¼èÆÀÍѤΥ¤¥ó¥¹¥¿¥ó¥¹ºîÀ®
NavMeshPath path = new ();

// ÌÜɸÃÏÅÀ¤Þ¤Ç¤Î·ÐÏ©·×»»¤ò¹Ô¤¤¡¢path ¤ËÂåÆþ
agent.CalculatePath(agentTargetPos, path);

// °ÜÆ°¤ò°ì»þÄä»ß
PauseMove();

return path;
}

// °ÜÆ°¤ò°ì»þÄä»ß
PauseMove();
return null;
}


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


/// <summary>
/// Ũ¤Î¿Ê¹ÔÊý¸þ¤ò¼èÆÀ¤·¤Æ¡¢°ÜÆ°¥¢¥Ë¥á¤ÈƱ´ü
/// </summary>
private void ChangeAnimeDirection(int index)
{
Debug.Log("index : "+index);

//¼¡¤Î°ÜÆ°Àè¤ÎÃÏÅÀ¤¬¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤³¤Ç½èÍý¤ò½ªÎ»¤¹¤ë
if(index >= paths.Length)
{
return;
}

//ÌÜɸ¤Î°ÌÃ֤ȸ½ºß¤Î°ÌÃ֤Ȥε÷Î¥¤ÈÊý¸þ¤ò¼èÆÀ¤·¡¢Àµµ¬²½½èÍý¤ò¹Ô¤¤¡¢
//ñ°Ì¥Ù¥¯¥È¥ë¤È¤¹¤ë(Êý¸þ¤Î¾ðÊó¤Ï»ý¤Á¤Ä¤Ä¡¢µ÷Î¥¤Ë¤è¤ë®ÅÙº¹¤ò¤Ê¤¯¤·¤Æ°ìÄêÃͤˤ¹¤ë)
Vector3 direction = (transform.position - paths[index]).normalized;
Debug.Log("direction : "+direction);


//¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î Palameter ¤ÎÃͤò¹¹¿·¤·¡¢
//°ÜÆ°¥¢¥Ë¥á¤Î BlendTree ¤òÀ©¸æ¤·¤Æ°ÜÆ°¤ÎÊý¸þ¤È°ÜÆ°¥¢¥Ë¥á¤òƱ´ü
anim.SetFloat("X",direction.x);
anim.SetFloat("Y",direction.y);
}

/// <summary>
/// ¥À¥á¡¼¥¸·×»»
/// </summary>
/// <param name="amount"></param>
public void CulcDamage(float amount)
{

// Hp ¤ÎÃͤò¸º»»¤·¤¿·ë²ÌÃͤò¡¢ºÇÄãÃͤȺÇÂçÃͤÎÈÏ°ÏÆâ¤Ë¼ý¤Þ¤ë¤è¤¦¤Ë¤·¤Æ¹¹¿·
//Mathf.Clamp(x, y, z) => x¤ÏÀ©¸æ¤·¤¿¤¤»ØÄêÃÍ¡¢y¤Ï»ØÄꤹ¤ëÈϰϤκǾ®ÃÍ¡¢z¤ÏºÇÂçÃÍ
hp = Mathf.Clamp(hp -= amount, 0, maxHp);
//

Debug.Log("»Ä¤êHP : " + hp);

// Hp ¤¬ 0 °Ê²¼¤Ë¤Ê¤Ã¤¿¾ì¹ç
if (hp <= 0)
{

// Ç˲õ½èÍý¤ò¼Â¹Ô¤¹¤ë¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹
DestroyEnemy();
}

// TODO ±é½ÐÍѤΥ¨¥Õ¥§¥¯¥ÈÀ¸À®


// ¥Ò¥Ã¥È¥¹¥È¥Ã¥×±é½Ð
StartCoroutine(WaitMove());

}

/// <summary>
/// ŨÇ˲õ½èÍý
/// </summary>
public void DestroyEnemy()
{

// Kill ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¡¢tween ÊÑ¿ô¤ËÂåÆþ¤µ¤ì¤Æ¤¤¤ë½èÍý(DOPath ¤Î½èÍý)¤ò½ªÎ»¤¹¤ë
tween.Kill();

// TODO SE¤Î½èÍý


// TODO Ç˲õ»þ¤Î¥¨¥Õ¥§¥¯¥È¤ÎÀ¸À®¤ä´ØÏ¢¤¹¤ë½èÍý


GameManager.Instance.GameClearJudge();

GameManager.Instance.RemoveEnemyList(this);

// Ũ¥­¥ã¥é¤ÎÇ˲õ
Destroy(gameObject);


}

/// <summary>
/// °ÜÆ°¤ò°ì»þÄä»ß
/// </summary>
public void PauseMove()
{
tween?.Pause();


////*¡¡½èÍý¤ÎÄɲá¡*////


if (agent == null) return;
agent.isStopped = true;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


}

/// <summary>
/// °ÜÆ°¤ò³«»Ï
/// </summary>
public void ResumeMove()
{
tween?.Play();


////*¡¡½èÍý¤ÎÄɲá¡*////


if (agent == null) return;
agent.isStopped = false;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


}

/// <summary>
/// ¥Ò¥Ã¥È¥¹¥È¥Ã¥×±é½Ð
/// </summary>
/// <returns></returns>
private IEnumerator WaitMove()
{
tween.timeScale = 0.05f;
yield return new WaitForSeconds(0.5f);
tween.timeScale = 1.0f;
}

private void OnCollisionEnter2D(Collision2D collision) {

// TODO TryGetComponent ¤ËÊѤ¨¤ë
if(collision.gameObject.CompareTag("Wall")) {

// TODO Ũ¤Î¥Ñ¥¿¡¼¥ó¤Ë¤è¤ê¡¢Êɤ¬¤Ê¤¯¤Ê¤ë¤Þ¤Ç°ÜÆ°Ää»ß¡¢¥ê¥Ù¥¤¥¯¤·¤Æ·ÐÏ©¤ÎºÆ·×»»¤·¤¿¾å¤Ç°ÜÆ°ºÆ³«¡¢Ç˲õ¹ÔÆ°¤Î¤è¤¦¤Ëʬ´ô¤µ¤»¤ë
Reroute();

// TODO ¾ã³²Êª¤¬¤Ê¤¯¤Ê¤Ã¤¿ºÝ¤Ë¤â¾ã³²ÊªÂ¦¤Ç¥ê¥Ù¥¤¥¯¤¹¤ë¤³¤È

}
}


////*¡¡¿·¤·¤¤¥á¥½¥Ã¥É¤ò£³¤ÄÄɲá¡*////


/// <summary>
/// ·ÐÏ©¤ÎºÆ·×»»
/// </summary>
private void Reroute() {
PauseMove();

// Builder ¤Î UpdateMedhod ¤ò Manual ¤ËÀßÄꤷ¤Æ¤ª¤¯¤³¤È¤Ç¡¢¼«Æ° Bake ¤¬¤Ê¤¯¤Ê¤ê¡¢¤³¤³¤Ç¼êÆ° Bake ¤Ç¤­¤ë
// ¤½¤¦¤¹¤ë¤³¤È¤ÇÊɤòÇÛÃÖ¤·¤¿¥¿¥¤¥ß¥ó¥°¤Ç¤Ï¤Ê¤¯¡¢Êɤˤ֤Ĥ«¤Ã¤¿¥¿¥¤¥ß¥ó¥°¤Ç Bake ¤Ç¤­¤ë
// Agent ¤Î autoRepath ¤Ï false ¤Ë¤Ê¤Ã¤Æ¤¤¤Æ¤â¾ã³²Êª¤òÃÖ¤¤¤¿»þÅÀ¤Ç·ÐÏ©·×»»¤¬¼«Æ°Åª¤ËÆ°¤¯¤Î¤Ç¡¢Bake ¤Î¥¿¥¤¥ß¥ó¥°¼«ÂΤòÊѤ¨¤ë¤³¤È¤ÇÂбþ¤·¤¿
navMeshBuilder.RebuildNavmesh(false);

// Ʊ´ü½èÍý¤Ê¤Î¤Ç¡¢¾å¤Î½èÍý¤¬½ª¤ï¤Ã¤Æ¤¤¤ì¤Ð·ÐÏ©¤ÎºÆ·×»»²Äǽ
SetRoute();
ResumeMove();
Debug.Log("SetRoute");
}

/// <summary>
/// NavMeshAgent ¤ÎÌÜɸÃÏÅÀÀßÄê
/// </summary>
private void SetRoute() {
agent.SetDestination(agentTargetPos);
}

/// <summary>
/// °ÜÆ°Êý¸þ¤È¥¢¥Ë¥á¤ÎϢư(MoveToClickTileMapPoint ¥¹¥¯¥ê¥×¥È¦¤«¤é¼Â¹Ô¤¹¤ë)
/// </summary>
/// <param name="corners"></param>
/// <returns></returns>
public IEnumerator SetAnime(Vector3[] corners) {

//Debug.Log("¥¢¥Ë¥á³«»Ï");

currentCornerIndex = 0;

while (true) {

// ËɱҵòÅÀ¤ËŨ¤¬¿¯Æþ¤¹¤ë¤ÈÇ˲õ¤µ¤ì¤ë¤¿¤á¡¢¤½¤Î¥¿¥¤¥ß¥ó¥°¤Ç¤³¤Î½èÍý¤òÄä»ß¤µ¤»¤ë¡£¤½¤¦¤·¤Ê¤¤¤È MissingReferenceException¥¨¥é¡¼¤¬½Ð¤ë
if (this == null || gameObject == null || !gameObject.activeInHierarchy) {
break;
}

//Debug.Log(Vector2.Distance(transform.position, corners[currentCornerIndex]));

// Vector3 ¤À¤È¾å¼ê¤¯¤¤¤«¤Ê¤¤¤Î¤Ç Vector2 ¤òÍøÍѤ¹¤ë(Z À®Ê¬¤¬¤¢¤ë¤È·×»»Ãͤ¬ÊѤï¤ë¤¿¤á)
if (Vector2.Distance(transform.position, corners[currentCornerIndex]) <= 0.3f) {

currentCornerIndex++;
Debug.Log(currentCornerIndex);

if (currentCornerIndex >= corners.Length) {
Debug.Log("¥¢¥Ë¥á½ªÎ»");
yield break;
}

// ¤³¤³¤â Vector3 ¤À¤È¾å¼ê¤¯¤¤¤«¤Ê¤¤¤Î¤Ç Vector2 ¤òÍøÍѤ¹¤ë¡£Íýͳ¤Ï¾åµ­¤ÈƱ¤¸
Vector2 direction = (corners[currentCornerIndex] - transform.position).normalized;

// BlendTree ¤Ë¥¢¥Ë¥á¡¼¥·¥ç¥ó¤ÎÌ¿Îá¤ò¹Ô¤¦
anim.SetFloat("X", direction.x);
anim.SetFloat("Y", direction.y);
}

yield return null;
}
}


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


}
||=
[END]

----

¡¡Å¨¤Î¥µ¥ó¥×¥ë¤Ç¤¹¡£
Åö¤¿¤êȽÄê¤ò¼è¤ë¤¿¤á Rigidbody2D ¤âÄɲ䵤ì¤Æ¤¤¤Þ¤¹¡£
¤Ê¤ª BodyType ¤ò Kinematic ¤Ë¤·¤Æ¤ª¤«¤Ê¤¤¤È NavMeshAgent ¤¬Àµ¤·¤¯Æ°¤­¤Þ¤»¤ó¤Î¤ÇÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£


&ref(https://image02.seesaawiki.jp/i/o/i-school-memo/uIU7IvhtBL.png, 35%)

----

**¡ãEnemyGenerator¡ä

¡¡Å¨¤òÀ¸À®¤·¤¿¥¿¥¤¥ß¥ó¥°¤Ç¡¢Å¨¤Î°ÜÆ°ÌÜɸÃÏÅÀ¡¢NavMeshBuilder2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¾ðÊó¤ò°ú¿ô¤òÍøÍѤ·¤ÆÅϤ¹¤è¤¦¤Ë¤·¤Þ¤¹¡£
°ú¿ô¤òÅϤ¹¤¿¤á¤Ë EnemyController ¤Ë¿·¤·¤¯ SetUpEnemyController ¥á¥½¥Ã¥É¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£

¡¡»öÁ°¤Ë·ÐÏ©¤ò¢ª¤Çɽ¼¨¤¹¤ëµ¡Ç½¤Ë¤Ï¡¢DOTween ¤ÎºÂɸ¤ÎÂå¤ï¤ê¤Ë¡¢NavMeshAgent ¤ÎºÂɸ¤òÍøÍѤ¹¤ë¤³¤È¤Ç¡¢¤¤¤Þ¤Þ¤Ç¤Î½èÍý¤òήÍѤ·¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ï¥á¥½¥Ã¥É¤Î°ú¿ô¤ËÅϤ¹¾ðÊó¤òÊѲ½¤µ¤»¤ë¤³¤È¤ÇÂбþ¤Ç¤­¤Æ¤¤¤Þ¤¹¡£¥×¥í¥°¥é¥à¤Î¤è¤¤Éôʬ¤È¤¤¤¨¤Þ¤¹¡£


''EnemyGenerator.cs''
[+] <= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤­¤Þ¤¹¡£
=|BOX|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.AI;¡¡¡¡//¡¡¡ù¡¡Äɲä·¤Þ¤¹

public class EnemyGenerator : MonoBehaviour
{
[SerializeField]
private EnemyController enemyControllerPrefab;

[SerializeField]
private PathData[] pathDatas;

[SerializeField]
private DrawPathLine pathLinePrefab;

private GameManager gameManager;


////*¡¡¿·¤·¤¤ÊÑ¿ô¤ÎÄɲá¡*////


[SerializeField]
private Transform agentTargetTran;

private NavMeshBuilder2D navMeshBuilder;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


public void SetUpEnemyGenerator(NavMeshBuilder2D navMeshBuilder) {¡¡¡¡//¡¡¢«¡¡°ú¿ô¤òÄɲ䷤Ƥ¤¤Þ¤¹


////*¡¡¿·¤·¤¤½èÍý¤ÎÄɲá¡*////


this.navMeshBuilder = navMeshBuilder;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


}


/// <summary>
/// Ũ¤ÎÀ¸À®½àÈ÷
/// </summary>
/// <returns></returns>
public IEnumerator PreparateEnemyGenerate(GameManager gameManager)
{
this.gameManager = gameManager;

// À¸À®ÍѤΥ¿¥¤¥Þ¡¼ÍÑ°Õ
int timer = 0;

// isEnemyGenetate ¤¬ true ¤Î´Ö¤Ï¥ë¡¼¥×¤¹¤ë
while (gameManager.isEnemyGenerate)
{
if(this.gameManager.currentGameState == GameManager.GameState.Play)
{
¡¡¡¡ // ¥¿¥¤¥Þ¡¼¤ò²Ã»»
¡¡¡¡ timer++;

// ¥¿¥¤¥Þ¡¼¤ÎÃͤ¬Å¨¤ÎÀ¸À®ÂÔµ¡»þ´Ö¤òĶ¤¨¤¿¤é
if (timer > gameManager.generateIntervalTime)
{

// ¼¡¤ÎÀ¸À®¤Î¤¿¤á¤Ë¥¿¥¤¥Þ¡¼¤ò¥ê¥»¥Ã¥È
timer = 0;

// Ũ¤ÎÀ¸À®
//GenerateEnemy();

//Ũ¤ÎÀ¸À®¿ô¤Î¥«¥¦¥ó¥È¥¢¥Ã¥×¤È List ¤Ø¤ÎÄɲÃ
gameManager.AddEnemyList(GenerateEnemy());

// ºÇÂçÀ¸À®¿ô¤òĶ¤¨¤¿¤éÀ¸À®Ää»ß
gameManager.JudgeGenerateEnemysEnd();
}
}

// 1¥Õ¥ì¡¼¥àÃæÃÇ
yield return null;
}
// TODO À¸À®½ªÎ»¸å¤Î½èÍý¤òµ­½Ò¤¹¤ë

}

/// <summary>
/// Ũ¤ÎÀ¸À®
/// </summary>
/// <param name="generateNo"></param>
/// <returns></returns>
public EnemyController GenerateEnemy(int generateNo = 0)
{
// ¥é¥ó¥À¥à¤ÊÃͤòÇÛÎó¤ÎºÇÂçÍ×ÁÇ¿ôÆâ¤Ç¼èÆÀ
int randomValue = Random.Range(0, pathDatas.Length);

// »ØÄꤷ¤¿°ÌÃÖ¤ËŨ¤òÀ¸À®
EnemyController enemyController = Instantiate(enemyControllerPrefab, pathDatas[randomValue].generateTran.position, Quaternion.identity);


////*¡¡¿·¤·¤¤½èÍý¤ÎÄɲäȥ³¥á¥ó¥È¥¢¥¦¥È¤ÎÄɲá¡*////


// °ÜÆ°¤¹¤ëÃÏÅÀ¤ò¼èÆÀ
//Vector3[] paths = pathDatas[randomValue].pathTranArray.Select(x => x.position).ToArray();¡¡¡¡//¡¡¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Þ¤¹

// Ũ¥­¥ã¥é¤Î½é´üÀßÄê¤ò¹Ô¤¤¡¢°ÜÆ°¤ò°ì»þÄä»ß¤·¤Æ¤ª¤¯
//enemyController.SetUpEnemyController(paths);¡¡¡¡¡¡¡¡¡¡¡¡//¡¡¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Þ¤¹


¡¡¡¡¡¡¡¡// ¡ù¡¡Äɲä·¤Þ¤¹
// ·ÐÏ©¤Ï NavMesh ¤¬·×»»¤¹¤ë¤Î¤Ç¡¢ÌÜɸÃÏÅÀ¤È¡¢ NavMesh ¤Î¥ê¥Ù¥¤¥¯¤¬¹Ô¤¨¤ë¤è¤¦¤Ë NavMeshBuilder ¤Î¾ðÊó¤òÅϤ¹
NavMeshPath agentPath = enemyController.SetUpEnemyController(agentTargetTran.position, navMeshBuilder);


¡¡¡¡¡¡¡¡// ¡ù¡¡Äɲä·¤Þ¤¹
// °ÜÆ°¤¹¤ëÃÏÅÀ¤ò¼èÆÀ
Vector3[] paths = agentPath.corners;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////



¡¡¡¡¡¡¡¡// ¤¤¤Þ¤Þ¤Ç¤ÈƱ¤¸½èÍý¤Ç¤¹¤¬¡¢paths ¤ÎÃͤ¬ DOTween ¤ÎºÂɸ¤Ç¤Ï¤Ê¤¯ NavMeshAgent ¤Î·ÐÏ©¤ÎºÂɸ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹
// Ũ¤Î°ÜÆ°·ÐÏ©¤Î¥é¥¤¥óɽ¼¨¤òÀ¸À®¤Î½àÈ÷
StartCoroutine(PreparateCreatePathLine(paths, enemyController));

return enemyController;
}

/// <summary>
/// ¥é¥¤¥óÀ¸À®¤Î½àÈ÷
/// </summary>
/// <param name="paths"></param>
/// <returns></returns>
private IEnumerator PreparateCreatePathLine(Vector3[] paths, EnemyController enemyController)
{
// ¥é¥¤¥ó¤ÎÀ¸À®¤Èºï½ü¡£¤³¤Î½èÍý¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¤Ï¡¢¤³¤Î½èÍý¤è¤ê²¼¤Î½èÍý¤Ï¼Â¹Ô¤µ¤ì¤Ê¤¤
yield return StartCoroutine(CreatePathLine(paths));

//Play¤Þ¤ÇÂÔ¤Ä
yield return new WaitUntil(() => gameManager.currentGameState == GameManager.GameState.Play);


////*¡¡¿·¤·¤¤½èÍý¤ÎÄɲá¡*////


// Äɲá£NavMeshAgent ÍѤΥ¢¥Ë¥áƱ´ü½èÍý
StartCoroutine(enemyController.SetAnime(paths));


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


// Ũ¤Î°ÜÆ°¤òºÆ³«
enemyController.ResumeMove();
}

/// <summary>
/// °ÜÆ°·ÐÏ©ÍѤΥ饤¥ó¤ÎÀ¸À®¤ÈÇË´þ
/// </summary>
private IEnumerator CreatePathLine(Vector3[] paths)
{
// List ¤ÎÀë¸À¤È½é´ü²½
List<DrawPathLine> drawPathLinesList = new List<DrawPathLine>();

// £±¤Ä¤Î Path ¤´¤È¤Ë£±¤Ä¤º¤Ä½çÈ֤˥饤¥ó¤òÀ¸À®
for (int i = 0; i < paths.Length - 1; i++)
{
DrawPathLine drawPathLine = Instantiate(pathLinePrefab, transform.position, Quaternion.identity);

Vector3[] drawPaths = new Vector3[2] { paths[i], paths[i + 1] };

drawPathLine.CreatePathLine(drawPaths);

drawPathLinesList.Add(drawPathLine);

yield return new WaitForSeconds(0.1f);
}

// ¤¹¤Ù¤Æ¤Î¥é¥¤¥ó¤òÀ¸À®¤·¤ÆÂÔµ¡
yield return new WaitForSeconds(0.5f);

// £±¤Ä¤Î¥é¥¤¥ó¤º¤Ä½çÈ֤˺ï½ü¤¹¤ë
for (int i = 0; i < drawPathLinesList.Count; i++)
{
Destroy(drawPathLinesList[i].gameObject);

yield return new WaitForSeconds(0.1f);
}
}
}
||=
[END]

----

**¡ãGameManager¡ä

¡¡NavMeshBuilder2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¥¢¥µ¥¤¥óÍѤÎÊÑ¿ô¤òÄɲä·¡¢EnemyGenerator ¥¯¥é¥¹¤Ë¥á¥½¥Ã¥É¤Î°ú¿ô¤òÍøÍѤ·¤ÆÅϤ¹¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
¤½¤ì°Ê³°¤ÎÉôʬ¤ÏÊѹ¹¤¢¤ê¤Þ¤»¤ó¡£


''GameManager.cs''
[+] <= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤­¤Þ¤¹¡£
=|BOX|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
public static GameManager Instance;

private void Awake()
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject); // Æó½ÅÀ¸À®¤òËɤ°
}

[SerializeField]
private EnemyGenerator enemyGenerator;

[SerializeField]
private CharaGenerator charaGenerator;

public bool isEnemyGenerate;

public int generateIntervalTime;

public int generateEnemyCount;

public int maxEnemyCount;

[SerializeField]
private int enemyDestroyCount = 0;

//¡¡Å¨¤Î¾ðÊó¤ò°ì¸µ²½¤·¤Æ´ÉÍý¤¹¤ë
[SerializeField]
private List<EnemyController> enemiesList = new List<EnemyController>();

//¥¿¥¤¥Þ¡¼¥·¥¹¥Æ¥à
public int timer;

public enum GameState
{
Preparate, //¥²¡¼¥à¤Î½àÈ÷Ãæ(¥í¡¼¥É)
Select, //¥¹¥¿¡¼¥È²èÌÌ
Arsenal, //ÊÔÀ®²èÌÌ
Play, //¥²¡¼¥à¥×¥ì¥¤²èÌÌ
Pause, //¥Ý¡¼¥ºÃæ
GameUp //¥¯¥ê¥¢¡¢¥²¡¼¥à¥ª¡¼¥Ð¡¼¤É¤Á¤é¤«
}

public GameState currentGameState;


////*¡¡¿·¤·¤¤ÊÑ¿ô¤ÎÄɲá¡*////


[SerializeField] private NavMeshBuilder2D navMeshBuilder;


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


void Start()
{
// ¥²¡¼¥à¤Î¿Ê¹Ô¾õÂÖ¤ò½àÈ÷Ãæ¤ËÀßÄê
SetGameState(GameState.Preparate);


// TODO ¥²¡¼¥à¥Ç¡¼¥¿¤ò½é´ü²½


// TODO ¥¹¥Æ¡¼¥¸¤ÎÀßÄê + ¥¹¥Æ¡¼¥¸¤´¤È¤Î PathData ¤òÀßÄê

// ¥­¥ã¥éÇÛÃÖÍѥݥåץ¢¥Ã¥×¤ÎÀ¸À®¤ÈÀßÄê
StartCoroutine(charaGenerator.SetUpCharaGenerator(this));

// TODO µòÅÀ¤ÎÀßÄê


// TODO ¥ª¡¼¥×¥Ë¥ó¥°±é½ÐºÆÀ¸

// À¸À®¤Îµö²Ä¤ò¤¹¤ë
isEnemyGenerate = true;

// ¥²¡¼¥à¤Î¿Ê¹Ô¾õÂÖ¤ò¥×¥ì¥¤Ãæ¤ËÊѹ¹
SetGameState(GameState.Play);


////*¡¡¿·¤·¤¤½èÍý¤ÎÄɲá¡*////


enemyGenerator.SetUpEnemyGenerator(navMeshBuilder);


////*¡¡¤³¤³¤Þ¤Ç¡¡*////


// Ũ¤ÎÀ¸À®½àÈ÷
StartCoroutine(enemyGenerator.PreparateEnemyGenerate(this));

// ¥«¥ì¥ó¥·¡¼¤Î¼«Æ°³ÍÆÀ½èÍý¤Î³«»Ï
StartCoroutine(TimerCount());
StartCoroutine(GameData.Instance.TimeToGold());
}


/// <summary>
/// Ũ¤Î¾ðÊó¤ò List ¤ËÄɲÃ
/// </summary>
/// <param name="enemy"></param>
public void AddEnemyList(EnemyController enemy)
{ //¡¡TODO¡¡Å¨¤Î¾ðÊó¤ò List ¤ËÄɲ乤ëºÝ¤Ë¡¢°ú¿ô¤òÄɲÃ


//¡¡TODO¡¡Å¨¤Î¾ðÊó¤ò List ¤ËÄɲÃ
enemiesList.Add(enemy);
// Ũ¤ÎÀ¸À®¿ô¤ò¥«¥¦¥ó¥È¥¢¥Ã¥×
generateEnemyCount++;
}

/// <summary>
/// Ũ¤ÎÀ¸À®¤òÄä»ß¤¹¤ë¤«È½Äê
/// </summary>
public void JudgeGenerateEnemysEnd()
{
if (generateEnemyCount >= maxEnemyCount)
{
isEnemyGenerate = false;
}
}

/// <summary>
/// GameState ¤ÎÊѹ¹
/// </summary>
/// <param name="nextGameState"></param>
public void SetGameState(GameState nextGameState)
{
currentGameState = nextGameState;//¥²¡¼¥à¤Î¾õÂÖ¤òÀßÄê
}

/// <summary>
/// ¤¹¤Ù¤Æ¤ÎŨ¤Î°ÜÆ°¤ò°ì»þÄä»ß
/// </summary>
public void PauseEnemies()
{
for (int i = 0; i < enemiesList.Count; i++)
{
enemiesList[i].PauseMove();
}
}

/// <summary>
/// ¤¹¤Ù¤Æ¤ÎŨ¤Î°ÜÆ°¤òºÆ³«
/// </summary>
public void ResumeEnemies()
{
for (int i = 0; i < enemiesList.Count; i++)
{
enemiesList[i].ResumeMove();
}
}

/// <summary>
/// Ũ¤Î¾ðÊó¤ò List ¤«¤éºï½ü
/// </summary>
/// <param name="removeEnemy"></param>
public void RemoveEnemyList(EnemyController removeEnemy)
{
enemiesList.Remove(removeEnemy);
}

public void EnemyDestroyCount()
{
enemyDestroyCount++;
Debug.Log("EnemyDestroyCount:" + enemyDestroyCount);
}

// ¥²¡¼¥à¥¯¥ê¥¢È½Äê
public void GameClearJudge()
{
//¡¡TODO Ũ¥­¥ã¥éÇ˲õ²ó¿ô¤Î¥«¥¦¥ó¥È
EnemyDestroyCount();

//¡¡maxEnemyCount(GameManager)¤ÈÇ˲õ¿ô¤òÈæ³Ó
if (enemyDestroyCount == maxEnemyCount)
{
// ¥¯¥ê¥¢È½Äê¥á¥½¥Ã¥É¸Æ¤Ó½Ð¤·
Debug.Log("¥²¡¼¥à¥¯¥ê¥¢");
}
}

// ¥¿¥¤¥Þ¡¼·×¬¥á¥½¥Ã¥É
public IEnumerator TimerCount()
{
while(true)
{
if(currentGameState == GameState.Play)
{
timer++;
}

yield return new WaitForSeconds(1f);
}
}
}
||=
[END]

----

*³Æ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀßÄê¤ò¹Ô¤¦

¡¡GameManager ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë NavMeshBuilder2D ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤¬¥¢¥¿¥Ã¥Á¤µ¤ì¤Æ¤¤¤ë¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥µ¥¤¥ó¤·¤Þ¤¹¡£


&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/_yzmuBw8LI.png, 35%)
¡¡

----

¡¡EnemyGenerator ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¡¢NavMeshAgent ¤¬¥¢¥¿¥Ã¥Á¤µ¤ì¤Æ¤¤¤ëŨ¤Î¥×¥ì¥Ï¥Ö¤È¡¢ÌÜɸÃÏÅÀ¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥µ¥¤¥ó¤·¤ÆÅÐÏ¿¤·¤Þ¤¹¡£


&ref(https://image02.seesaawiki.jp/i/o/i-school-memo/VyA2zHH2z9.png, 35%)


¡¡°Ê¾å¤ÇÀßÄê¤Ï´°Î»¤Ç¤¹¡£

----

*¥²¡¼¥à¤ò¼Â¹Ô¤·¤ÆÆ°ºî¤ò³Îǧ¤¹¤ë

¡¡¥²¡¼¥à¤ò¼Â¹Ô¤·¡¢NavMeshAgent ¤Îµ¡Ç½¤Ë¤è¤ê¡¢Å¨¤¬°ÜÆ°¤¹¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤È¤È¤â¤Ë¡¢
¾ã³²Êª¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¥²¡¼¥àÆâ¤Ç°ÜÆ°¤µ¤»¤¿¤ê¡¢É½¼¨¤·¤¿¤ê¤·¤Æ·ÐÏ©¤òºÉ¤°¤è¤¦¤Ë¤·¤Þ¤¹¡£

¡¡ºÉ¤¤¤À¥¿¥¤¥ß¥ó¥°¤Ç¤Ï¤Ê¤¯¡¢Å¨¤¬¾ã³²Êª¤ËÀÜ¿¨¤·¤¿¥¿¥¤¥ß¥ó¥°¤Ç·ÐÏ©¾ðÊ󤬹¹¿·¤µ¤ì¤Æ¡¢¿·¤·¤¤·ÐÏ©¤Ë±è¤Ã¤Æ°ÜÆ°¤ò¤¹¤ë¤è¤¦¤Ë¤Ê¤ì¤ÐÀ©¸æÀ®¸ù¤Ç¤¹¡£


&ref(https://image01.seesaawiki.jp/i/o/i-school-memo/SrIyVRtOxk.gif, 50%)


¡¡°Ê¾å¤Ç´°À®¤Ç¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹