๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•

๋Œ€๋ถ€๋ถ„ ์œ ๋‹ˆํ‹ฐ ์บ๋ฆญํ„ฐ ์ด๋™ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ํ‚ค๋ณด๋“œ์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ด๋™์‹œํ‚ค๋Š” ์˜ˆ์ œ๋“ค์ด ๋งŽ์€๋ฐ,

๋งˆ์šฐ์Šค๋กœ ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ ค ํ•œ๋‹ค. 

 

์ค€๋น„ ๊ณผ์ •


๊ฐ„๋‹จํ•œ ์บ๋ฆญํ„ฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ณ  ์บ๋ฆญํ„ฐ ์˜ค๋ธŒ์ ํŠธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ™์—ฌ๋„ฃ๋Š”๋‹ค.

  • Control.cs: ๋งˆ์šฐ์Šค๋‚˜ ํ‚ค๋ณด๋“œ์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์บ๋ฆญํ„ฐ์—๊ฒŒ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ์Šคํฌ๋ฆฝํŠธ
  • Behavior.cs: ์‹ค์ œ ์บ๋ฆญํ„ฐ์˜ ํ–‰๋™์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ

์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์กด์žฌํ•  ๋•Œ, ๋‚ด ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ๋งŒ ์›€์ง์ด๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚ด ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ์—๋งŒ Control.cs๋งŒ ํ™œ์„ฑํ™” ํ•ด์ฃผ๊ณ  ๋‹ค๋ฅธ ์บ๋ฆญํ„ฐ๋“ค์€ ๋น„ํ™œ์„ฑํ™” ํ•ด์ฃผ๋ฉด ๋‚ด ์บ๋ฆญํ„ฐ๋งŒ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์ข… ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ์ œ๋ฅผ ๋„์™€ ์ค„ ๊ท€์—ผ๋‘ฅ์ด ๋น„๋ฒ„
์˜ˆ์ œ์— ์“ฐ์ผ ์ง€ํ˜•

์บ๋ฆญํ„ฐ๊ฐ€ ์›€์ง์ด๊ธฐ ์œ„ํ•ด 27x27์˜ ์ง€ํ˜•์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

 

๊ทธ ๋‹ค์Œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ(๋น„๋ฒ„ ์บ๋ฆญํ„ฐ๊ฐ€ ๋ )๋งŒ๋“ค์–ด ์บ๋ฆญํ„ฐ๋ฅผ ์ž…ํžˆ๊ณ  Box Collider์™€ Rigidbody(์ค‘๋ ฅ๊ณผ ์ถฉ๋Œ ์ ์šฉ)๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์ด ๋ถ€๋ถ„์€ ์ด๋™ ์˜ˆ์ œ์™€๋Š” ํฐ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ์ƒ๋žตํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Behavior.cs, Control.cs ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ๋„ฃ์–ด์ค€๋‹ค.

๋Œ€์ถฉ ์ด๋Ÿฐ์‹์œผ๋กœ..

 

์Šคํฌ๋ฆฝํŠธ


[Control.cs]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Control : MonoBehaviour
{
    private Behavior behavior; // ์บ๋ฆญํ„ฐ์˜ ํ–‰๋™ ์Šคํฌ๋ฆฝํŠธ
    private Camera mainCamera; // ๋ฉ”์ธ ์นด๋ฉ”๋ผ
    private Vector3 targetPos; // ์บ๋ฆญํ„ฐ์˜ ์ด๋™ ํƒ€๊ฒŸ ์œ„์น˜
    
    void Start()
    {
        behavior = GetComponent<Behavior>();
        mainCamera = GameObject.Find("Main Camera").GetComponent<Camera>();
    }

    void Update()
    {
        // ๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ๋ฐ›์•˜ ์„ ๋•Œ
        if (Input.GetMouseButtonUp(0))
        {
            // ๋งˆ์šฐ์Šค๋กœ ์ฐ์€ ์œ„์น˜์˜ ์ขŒํ‘œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 10000f))
            {
                targetPos = hit.point;
            }
        }

        // ์บ๋ฆญํ„ฐ๊ฐ€ ์›€์ง์ด๊ณ  ์žˆ๋‹ค๋ฉด
        if(behavior.Run(targetPos))
        {
            // ํšŒ์ „๋„ ๊ฐ™์ด ์‹œ์ผœ์ค€๋‹ค
            behavior.Turn(targetPos);
        }
        else
        {
            // ์บ๋ฆญํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜(์ •์ง€ ์ƒํƒœ)
            behavior.SetAnim(PlayerAnim.ANIM_IDLE);
        }
        
    }
}

์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์ž๋ฉด

1. Updateํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋งˆ์šฐ์Šค์˜ ์ž…๋ ฅ์„ ๊ฐ์ง€ํ•œ๋‹ค.

2. ๋งˆ์šฐ์Šค์˜ ์ž…๋ ฅ์ด ๊ฐ์ง€๋˜์—ˆ๋‹ค๋ฉด ํ˜„์žฌ ๋งˆ์šฐ์Šค์˜ ์œ„์น˜๋ฅผ ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ ํ•  ์ขŒํ‘œ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

2๋ฒˆ์˜ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋งํฌ์— ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด์žˆ๋„ค์š”
https://www.youtube.com/watch?v=hRRTv8hhCe0

3. Behavior.cs ์Šคํฌ๋ฆฝํŠธ์— ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” ์ขŒํ‘œ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ์‹ค์ œ ์ด๋™์‹œํ‚ค๊ณ (Run), ์ด๋™ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด(true) ํšŒ์ „๋„ ๊ฐ™์ด ์‹œํ‚จ๋‹ค.

 

[Behavior.cs]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Behavior : MonoBehaviour
{
    public float speed = 2.0f;
    private Rigidbody rigid;

    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
    }

    public bool Run(Vector3 targetPos)
    {
        // ์ด๋™ํ•˜๊ณ ์žํ•˜๋Š” ์ขŒํ‘œ ๊ฐ’๊ณผ ํ˜„์žฌ ๋‚ด ์œ„์น˜์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.
        float dis = Vector3.Distance(transform.position, targetPos);
        if (dis >= 0.01f) // ์ฐจ์ด๊ฐ€ ์•„์ง ์žˆ๋‹ค๋ฉด
        {
            // ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.
            transform.localPosition = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
            //SetAnim(PlayerAnim.ANIM_WALK); // ๊ฑท๊ธฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ
            return true;
        }
        return false;
        
    }

    public void Turn(Vector3 targetPos)
    {
        // ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” ์ขŒํ‘œ๊ฐ’ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „์‹œํ‚จ๋‹ค
        Vector3 dir = targetPos - transform.position;
        Vector3 dirXZ = new Vector3(dir.x, 0f, dir.z);
        Quaternion targetRot = Quaternion.LookRotation(dirXZ);
        rigid.rotation = Quaternion.RotateTowards(transform.rotation, targetRot, 550.0f * Time.deltaTime);
    }
}

Behavior ์Šคํฌ๋ฆฝํŠธ๋Š” Control ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ธ๋ฐ ๋ถ„์„ํ•ด ๋ณด๋ฉด

1. Control ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด Run ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

2. ์ด๋™ ์ขŒํ‘œ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋ฐ ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๊ฐ€ ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” ์œ„์น˜์™€ ๊ทผ์ ‘ํ•˜๋‹ค๋ฉด ์ด๋™์„ ํ•˜์ง€ ์•Š๊ณ 

3. ๊ทผ์ ‘ํ•˜์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

4. ์ด๋™ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด true, ์ด๋™ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด false๋ฅผ ๋ฆฌํ„ดํ•˜์—ฌ Control ์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ๋‚ด๊ฐ€ ์ •์ง€์ƒํƒœ์ธ์ง€ ์ด๋™์ƒํƒœ์ธ์ง€ ์•Œ๋ ค์ค€๋‹ค.

5. Turn(ํšŒ์ „) ํ•จ์ˆ˜๋„ ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์บ๋ฆญํ„ฐ๋ฅผ ํšŒ์ „์‹œ์ผœ์ค€๋‹ค.

Runํ•จ์ˆ˜์—์„œ Vector3.MoveTowards๋ฅผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ
์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์บ๋ฆญํ„ฐ๊ฐ€ ์ผ์ •ํ•œ ์†๋„๋กœ ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ ,
Vector3.Lerpํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ขŒํ‘œ๋กœ ์†๋„๋ฅผ ๋‚ด์„œ ์›€์ง์ด๋‹ค๊ฐ€ ๋„์ฐฉ์ง€์ ์— ๊ทผ์ ‘ํ–ˆ์„ ๋•Œ ์„œ์„œํžˆ ๋Š๋ ค์ง„๋‹ค.

 

๊ฒฐ๊ณผ


๋ฐ˜์‘ํ˜•