구현 목록
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로 설정해주자.
반응형
'산대특 > 게임 플랫폼 응용 프로그래밍' 카테고리의 다른 글
코루틴 안에서 코루틴 실행하기 (0) | 2024.02.29 |
---|---|
탱크 시즈모드 Splash 공격 구현하기 (0) | 2024.02.29 |
탱크 이동과 모드 전환 구현하기 (0) | 2024.02.29 |
[Zombero] Boss Stage 만들기 (0) | 2024.02.29 |
[HeroShooter -> Zombero] Stage4 NavMesh 경로 개선 (0) | 2024.02.27 |