실행 이미지

 

구현 목록

1. A 키를 누르고 저글링을 클릭 했을경우 저글링위치에 폭파 이펙트를 생성 하고 저글링을 제거

 

2. 사거리에 들어오지 않았다면 공격 x

 

3. 탱크 모드일경우 이동중에 공격했다면 이동을 멈추고 공격

 

using System.Collections;
using UnityEngine;

public class Tank : MonoBehaviour
{
    [SerializeField] GameObject indicator;
    [SerializeField] GameObject explosionPrefab;

    [SerializeField] Sprite tank_mode;
    [SerializeField] Sprite siege_mode;

    public LayerMask enemyLayer;

    [SerializeField] float tank_mode_attack_range = 3f;
    [SerializeField] float siege_mode_attack_range = 5f;

    public float speed = 5.0f;
    private Vector3 targetPosition;
    private bool isMoving = false;
    private bool isSiege = false;
    private Camera mainCamera;

    void Start()
    {
        indicator.SetActive(false);
        StartCoroutine(CoMove());
        StartCoroutine(ChangeMode());
        mainCamera = Camera.main;
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.A))
        {
            if(Input.GetMouseButtonDown(0))
            {
                StartCoroutine(CoAttack());

            }
        }
    }

    IEnumerator CoMove()
    {
        while (true)
        {
            if (Input.GetMouseButtonDown(1) && !isSiege)
            {
                targetPosition = mainCamera.ScreenToWorldPoint(Input.mousePosition);
                targetPosition.z = transform.position.z;

                StopCoroutine(MoveIndicator(targetPosition));
                StartCoroutine(MoveIndicator(targetPosition));

                if (transform.position.x < targetPosition.x) this.gameObject.transform.localScale = new Vector3(1, 1, 1);
                else this.gameObject.transform.localScale = new Vector3(-1, 1, 1);
                isMoving = true;
            }

            if (isMoving && !isSiege)
            {
                transform.position = Vector2.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);

                if (Vector3.Distance(transform.position, targetPosition) < 0.01f)
                {
                    isMoving = false;
                }
            }

            yield return null;
        }
    }

    IEnumerator ChangeMode()
    {
        while (true)
        {
            if (Input.GetKeyDown(KeyCode.O))
            {
                isSiege = !isSiege;
                GetComponent<SpriteRenderer>().sprite = isSiege ? siege_mode : tank_mode;
                isMoving = false;
            }
            yield return null;
        }
    }

    IEnumerator MoveIndicator(Vector3 position)
    {
        indicator.SetActive(true);
        indicator.transform.position = position;
        yield return new WaitForSeconds(0.5f);
        indicator.SetActive(false);
    }

    IEnumerator CoAttack()
    {
        Vector3 mousePosition = mainCamera.ScreenToWorldPoint(Input.mousePosition);
        mousePosition.z = transform.position.z;
        Collider2D clickedCollider = Physics2D.OverlapPoint(mousePosition, enemyLayer);

        if (clickedCollider != null)
        {
            float distance = Vector2.Distance(transform.position, clickedCollider.transform.position);
            if ((isSiege && distance <= siege_mode_attack_range) || (!isSiege && distance <= tank_mode_attack_range))
            {
                Instantiate(explosionPrefab, clickedCollider.transform.position, Quaternion.identity);
                Destroy(clickedCollider.gameObject);
                if (!isSiege) isMoving = false;
            }
        }

        yield return null;
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, isSiege ? siege_mode_attack_range : tank_mode_attack_range);
    }
}

Tank.cs

 

Collider2D clickedCollider

Physics2D.OverlapPoint의 반환값을 저장하는 변수.

이 변수는 마우스 클릭 위치에 있는 2D 콜라이더를 참조한다.

 

만약 마우스 클릭 위치에 콜라이더가 있다면, 해당 콜라이더의 참조가 이 변수에 저장되며,

그렇지 않다면 null이 저장된다.

 

 

Enemy는 Layer를 Enemy로 설정해주자.

반응형

+ Recent posts