ãUnityåå¿è åãããªããžã§ã¯ãã®å転⣠| æå®ããæ¹åãåããã â LookAtãšAtan2ã§ãåãããäœã
ä»åã¯ãæå®ããæ¹åãåãããæ¹æ³ããŸãšããŸãã
ãããŸã§ã®åã§ã¯ã
transform.eulerAngles
transform.rotation
Transform.Rotate()
ãªã©ã䜿ã£ãŠãå転ãã®ãã®ã倿Žããæ¹æ³ãèŠãŠããŸããã
ãã ãã²ãŒã ãäœã£ãŠãããšãäœåºŠå転ããããããããã
ããŠã¹ã®æ¹åãåãããã
æµããã¬ã€ã€ãŒã®æ¹åãåãããã«ããã
ç ²å°ãã¿ãŒã²ãããçãããã«ããã
ãšããå Žé¢ã®æ¹ããå®ã¯ããªãå€ãã§ãã
ä»åã¯ããã®ãããªãæå®ããæ¹åãåãããããšããèãæ¹ããã§ããã ãäžå¯§ã«æŽçããŠãããŸãã
颿°ãããã€ãåºãŠããã®ã§ãä»åã¯ç¹ã«å³è§£ããªããå°ããã€çè§£ãããšããæµãã§é²ããŸãã
ä»åã®ãŽãŒã«
ä»åã®ãŽãŒã«ã¯æ¬¡ã®3ã€ã§ãã
3Dã§ transform.LookAt() ã䜿ã£ãŠçžæã®æ¹åãåã
2Dã§ Mathf.Atan2() ã䜿ã£ãŠè§åºŠãæ±ãã
ããŠã¹ã®æ¹åãåãåŠçã®èãæ¹ãçè§£ãã
æå®ããæ¹åãåããããšãã«å€§åãªã®ã¯ãèªåããèŠãŠãçžæãã©ã¡ãã«ãããããèããããšã§ãã
ããšãã°ããã¬ã€ã€ãŒãããŠãããŠã¹ãæµãå¥ã®å Žæã«ãããšããŸãã
ãã®ãšãå¿
èŠãªã®ã¯ãã¿ãŒã²ããã®äœçœ® ãš èªåã®äœçœ®ã§ãã
ãã®2ç¹ããããã°ãèªåããã¿ãŒã²ãããžåããæ¹å ãèšç®ã§æ±ããããšãã§ããŸãã

1ïŒ3Dã§æå®ããæ¹åãåããã
1-1ïŒtransform.LookAt()
3Dã§ã¯ãçžæã®æ¹åãåãããããšã㯠transform.LookAt() ããšãŠã䟿å©ã§ãã
ããšãã°ãæµããã¬ã€ã€ãŒã®æ¹åãåããªããæ¬¡ã®ããã«æžããŸãã
public Transform target;
void Update()
{
transform.LookAt(target);
}ããã§ããã®ãªããžã§ã¯ã㯠target ã®æ¹åãåããŸãã
target ã«ã¯ãInspectorãããã¬ã€ã€ãŒã®Transformãå ¥ããŠããã°OKã§ãã
1-2ïŒLookAt() ã¯äœãããŠããã®ïŒ
LookAt() ã¯ãå éšã§ãçžæã¯ã©ã¡ãã«ãããããèŠãŠããã®æ¹åãžãªããžã§ã¯ããåããŠããŸãã
èªåã§è§åºŠãèšç®ããªããŠãããã®ã§ã3Dã§ã¯ãšãŠãæè»œã§ãã
ããšãã°ã
æµãã£ã©ã¯ã¿ãŒããã¬ã€ã€ãŒãèŠã
ã«ã¡ã©ãç®çå°ãèŠã
ç ²å°ãã¿ãŒã²ãããçã
ãšãã£ãåŠçã§ãã䜿ããŸãã

2ïŒ2Dã§æå®ããæ¹åãåããã
2Dã²ãŒã ã§ã¯ãèŠãç®ã®å転ã¯äž»ã« Z軞ã®å転 ã§è¡šçŸããŸãã
ãã®ããã3Dã® LookAt() ããã®ãŸãŸäœ¿ããããã
èªåã§è§åºŠãèšç®ããŠZ軞ã«å
¥ããæ¹æ³
ã®æ¹ãåãããããããšãå€ãã§ãã
ããã§ç»å Žããã®ã Mathf.Atan2() ã§ãã
2-1ïŒ2Dã§æå®ããæ¹åãåãããæµã
2Dã§åããäœãæµãã¯ã次ã®3ã¹ãããã§ãã
èªåããã¿ãŒã²ãããžã®æ¹åãæ±ãã
æ¹åããè§åºŠãæ±ãã
æ±ããè§åºŠãå転ã«èšå®ãã
ãã®3ã€ã«åãããšãããªãæŽçãããããªããŸãã
2-2. æ¹åãæ±ãã
ãŸãã¯ãèªåããã¿ãŒã²ãããžã®æ¹åãæ±ããŸãã
Vector2 direction = target.position - transform.position;ããã§ãã£ãŠããã®ã¯ããŸãã«å
ã»ã©ã® ã¿ãŒã²ããã®äœçœ® - èªåã®äœçœ® ã§ãã
ããã§ãã¿ãŒã²ããããã©ã¡ãã®æ¹åã«ãããïŒæ¹åãã¯ãã«ïŒããåãããŸãã

2-3. Mathf.Atan2() ã§è§åºŠãæ±ãã
次ã«ããã®æ¹åãè§åºŠã«å€æããŸãã
float angle = Mathf.Atan2(direction.y, direction.x);ããã§ãæ¹åããè§åºŠãæ±ããããšãã§ããŸãã
ãã ãããã®ãŸãŸã§ã¯å°ã泚æãå¿
èŠã§ãã
Mathf.Atan2() ãè¿ãå€ã¯ãåºŠæ°æ³ã®è§åºŠã§ã¯ãªãã
ã©ãžã¢ã³ãšããåäœã§ãã
ãªã Atan2 㯠ã¢ãŒã¯ã¿ã³ãžã§ã³ã2 ã®ããšã§ãã
Unityã®å転ã§ãã䜿ãã®ã¯ã床ããªã®ã§ã倿ããŸãã
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;ããã§ãå転ã«äœ¿ããããè§åºŠã«ãªããŸãã
Mathf.Atan2() ã¯äœãããŠããã®ïŒ
é£ããæãããããããŸããããåå¿è ã®æ®µéã§ã¯ãXãšYã®åããããäœåºŠã®æ¹åããæ±ããŠããã颿°ããšèããã°ååã§ãã
ããšãã°ã
å³ãªã 0床
äžãªã 90床
å·Šãªã 180床
äžãªã -90床
ã®ããã«ãåããè§åºŠãžå€ããŠãããŸãã


2-4. æ±ããè§åºŠãå転ãžèšå®ãã
è§åºŠãæ±ãŸã£ãããZ軞ã®å転ã«å ¥ããŸãã
transform.rotation = Quaternion.Euler(0, 0, angle);ããã§ã2Dãªããžã§ã¯ããæå®ããæ¹åãåããŸãã
2-5ïŒ2Dã§çžæã®æ¹åãåãåºæ¬åœ¢
ãŸãšãããšã2Dã§ã¿ãŒã²ããæ¹åãåãåºæ¬åœ¢ã¯æ¬¡ã®ããã«ãªããŸãã
public Transform target;
void Update()
{
Vector2 direction = target.position - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle);
}
ãã®åœ¢ã¯ããªãéèŠã§ãã
æµããã¬ã€ã€ãŒãåã
ç ²å°ãçžæãçã
ç¢å°ãç®çå°ãåã
ãšãã£ãå Žé¢ã§ããã®ãŸãŸå¿çšã§ããŸãã
3ïŒããŠã¹ã®æ¹åãåããã
ããããã¯ãç¹ã«éèŠã®é«ããããŠã¹ã®æ¹åãåããåŠçãèŠãŠãããŸãã
3-1ïŒã¯ãŒã«ã座æšã«å€æ
ãã ããããã§1ã€ãã€ã³ãããããŸãã
Input.mousePosition ã§ååŸã§ããã®ã¯ãç»é¢äžã®åº§æšïŒã¹ã¯ãªãŒã³åº§æšïŒ ã§ãã
äžæ¹ã§ãtransform.position ã¯ãã²ãŒã äžçã®åº§æšïŒã¯ãŒã«ã座æšïŒ ã§ãããã®ãŸãŸã§ã¯åº§æšã®çš®é¡ãéãã®ã§ããã®ãŸãŸåŒãç®ã¯ã§ããŸããã
ããã§ãããŠã¹åº§æšãã¯ãŒã«ã座æšãžå€æããŸãã
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);ããã§ãããŠã¹ã®äœçœ®ãã²ãŒã å ã®äœçœ®ãšããŠæ±ããããã«ãªããŸãã

3-2ïŒããŠã¹æ¹åãåãã³ãŒã
ã§ã¯ãããŠã¹ã«ãŒãœã«ãèŠç¶ããã³ãŒããå
¥åããŠã¿ãŸãã
ä»åã¯ãåã®è§£èª¬ã§äœ¿çšãããæŠè»ãã®ç»åã䜿ããŸãããç ²å°ãäžãåããŠããã®ããã€ã³ãã§ãã

void Update()
{
// ããŠã¹ã®åº§æšãååŸ
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// ããŠã¹ã®æ¹åãååŸ
Vector2 direction = mousePosition - transform.position;
// è§åºŠãèšç®
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
// ã¿ã³ã¯ã®åè»¢ãæŽæ° ç ²å°ãããŠã¹ã®æ¹åãåãããã«ãã
transform.rotation = Quaternion.Euler(0, 0, angle - 90f);
}
ããã§ããªããžã§ã¯ããããŠã¹ã®æ¹åãåããŸãã

3-3ïŒåãã®è£æ£
ããªãããããã®ãã
æ£ããèšç®ããŠããã®ã«ãèŠãç®ã ãåãããããŠãã
ãšããã±ãŒã¹ã§ãã
ããã¯ãã¹ãã©ã€ãã®å ã®åããåå ã§ãã
ä»åã®è§åºŠèšç®ã¯ãåºæ¬çã« å³æ¹åã0床 ãšããŠèããŠããŸãã
ä»åã®æŠè»ã®ããã«ã䜿ã£ãŠããç»åãæåãããäžåããããŸãã¯ãå·Šåããããäžåãããªã©ã«ãªã£ãŠãããšãèŠãç®ããããŸãã
ãã®å Žåã¯è£æ£ãå
¥ããŸãã
ããšãã°ãä»åã®æŠè»ã®ããã«äžåãã®ç»åãªãããã§ãã
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle - 90f);ãã®ããã« - 90f ããããšã§ãèŠãç®ãåãããããå ŽåããããŸãã

3-4ïŒããŠã¹æ¹åãåããªããšãã®ç¢ºèªãã€ã³ã
ããŸãåããªããšãã¯ã次ã確èªããŠã¿ãŠãã ããã
Camera.main ãååŸã§ããŠããã
ãªããžã§ã¯ãã«ã¹ã¯ãªãããã€ããŠããã
2Dãªã®ã«3Dã®åè»¢ãšæ··ãã£ãŠããªãã
ã¹ãã©ã€ãã®å ã®åãããããŠããªãã
Z軞以å€ã®å転ãå¥ã®åŠçã§å€æŽããŠããªãã
4ïŒ3Dã® LookAt() ãš 2Dã® Atan2() ã®äœ¿ãåã
ããã§ãä»åã®å å®¹ãæŽçããŠãããŸãã
3Dã§åãããããšã
transform.LookAt(target);æè»œ
çžæã®æ¹åãåããããã
æµãã«ã¡ã©ã§ãã䜿ã
2Dã§åãããããšã
Vector2 direction = target.position - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle);Z軞å転ãèªåã§äœãã
ããŠã¹æ¹åãåãããåŠçãšçžæ§ããã
æŠè»ãç ²å°ãæµãã£ã©ãªã©ã§äœ¿ãããã

ãŸãšã
ä»åã¯ãæå®ããæ¹åãåãããæ¹æ³ã確èªããŸããã
å転ãšãããšããäœåºŠåããããèããã¡ã§ãããå®éã®ã²ãŒã ã§ã¯
ãäœãåããã
ãèããå Žé¢ããšãŠãå€ãã§ãã
ãã®ãšãã¯ã
ãŸãæ¹åãæ±ãã
次ã«è§åºŠãæ±ãã
æåŸã«å転ãžèšå®ãã
ãšããæµãã§èãããšæŽçãããããªããŸãã
ç¹ã«2Dã§ã¯ã
Vector2 direction = target.position - transform.position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, angle);
ãã®æµããçè§£ããŠãããšãããªãå¿çšãããããªããŸãã
æåã¯å°ãé£ããæãããããããŸãããã
å³ã§ãæ¹åããšãè§åºŠãã®é¢ä¿ãèŠãªãã確èªãããšããã£ãšåããããããªããŸãã
ãã²ã
ããŠã¹ã®æ¹åãåã
æµããã¬ã€ã€ãŒãåã
ç ²å°ãçžæãçã
ãšãã£ãåãã§è©ŠããŠã¿ãŠãã ããã
ãã¡ãã¯Unityåå¿è
åãã®èšäºãããŒãå¥ã«ãŸãšããŠããŸãã
⌠Unityåå¿è
åãèšäºãŸãšãã¯ãã¡ã
ãã¡ãã®ãã¬ãžã³ãããã²ãŒã äœæè¬åº§ãå š8åã»ãããã§ãã·ãŒã³ã®åãæ¿ããªã©ã掻çšããŠãåå¿è ã§ãç¥èãŒãããäœããããã²ãŒã äœæè¬åº§ã玹ä»ããŠããŸãã

ããã«ã¹ãããã¢ããã®ãã¹ããã§éã¶ãžã£ã³ãã²ãŒã ã8åã»ãããã®ãã¬ãžã³ããã²ã掻çšãã ããã

ãã¡ã€ãããã¯ã¹ã§ã¯ãã¹ã¯ã©ãããUnityã®å奿å°ã®ãªã³ã©ã€ã³ã¬ãã¹ã³ãè¡ã£ãŠããŸãã
ãèå³ã®ããæ¹ã¯åœãµã€ãããªã³ã©ã€ã³ã¬ãã¹ã³ãããç¡æäœé𿿥ãžãåãåããäžããã
ãããªãšæã£ããå¿æŽãããïŒ
ãããããã°å¿æŽãé¡ãããŸãïŒ ããã ãããããã¯ã¯ãªãšã€ã¿ãŒãšããŠã®æŽ»åè²»ã«äœ¿ãããŠããã ããŸãïŒ