


+ 에너미 컨트롤러 스크립트
+ 캡슐 콜라이더 2D
+ 레이어 추가해주기


폭발 프리팹 패키지에 있음
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyController : MonoBehaviour
{
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tank : MonoBehaviour
{
private IEnumerator coroutine;
public GameObject tank;
public GameObject siege;
public float speed = 5.0f; // 이동 속도
private Vector3 targetPos; // 목표 위치
private bool isMoving = false; // 이동 중 여부
private bool isSiege = false; // 시즈모드 여부
[SerializeField] GameObject explosionPrefab; //폭발 프리팹
public LayerMask enemyLayer;
[SerializeField] float tank_range = 3f;
[SerializeField] float siege_range = 5f;
private Camera mainCamera;
void Start()
{
tank = transform.GetChild(0).gameObject;
siege = transform.GetChild(1).gameObject;
StartCoroutine(CoMove());
StartCoroutine(ChangeMode());
// mainCamera가 null이면 오류가 발생
mainCamera = Camera.main;
}
private void Update()
{
//A 키를 누르고 저글링을 클릭 - 공격하기
if (Input.GetKey(KeyCode.A))
{
if (Input.GetMouseButtonDown(0))
{
StartCoroutine(CoAttack());
}
}
}
IEnumerator CoMove()
{
// 탱크 움직이기
while (true)
{
// 마우스 우클릭 감지
if (Input.GetMouseButtonDown(1) && !isSiege) // 시즈 모드가 아닐 때만 이동
{
// 마우스 포인터 위치를 월드 좌표로 변환
targetPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
targetPos.z = transform.position.z; // z 좌표는 변경하지 않음
// 탱크 이미지 방향전환해주기
if (transform.position.x < targetPos.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, targetPos, speed * Time.deltaTime);
// 목표 위치에 도달했는지 확인
if (transform.position == targetPos)
{
isMoving = false; // 이동 중지
}
}
yield return null;
}
}
IEnumerator ChangeMode()
{
//탱크 모드 바꾸기
while (true)
{
if (Input.GetKeyDown(KeyCode.O))
{
isSiege = !isSiege; // 시즈 모드 토글
siege.SetActive(isSiege);
tank.SetActive(!isSiege);
if (isSiege)
{
isMoving = false; // 시즈 모드일 때는 이동 중지
}
else
{
isMoving = true;
}
}
yield return null;
}
}
IEnumerator CoAttack()
{
// 적 공격하기
// 마우스 위치를 화면 좌표에서 월드 좌표로 변환
Vector3 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);
//마우스 위치의 z 좌표를 transform.position.z로 설정
mousePos.z = transform.position.z;
//마우스 위치에 enemyLayer에 속하는 콜라이더가 있는지 검사
Collider2D collider = Physics2D.OverlapPoint(mousePos, enemyLayer);
if (collider != null)
{
//콜라이더가 있으면, 콜라이더와 transform.position 사이의 거리를 계산
float distance = Vector2.Distance(transform.position, collider.transform.position);
//거리가 공성 모드 또는 탱크 모드의 공격 범위 이내이면
//콜라이더의 위치에 explosionPrefab을 생성하고, 콜라이더를 파괴
if ((isSiege && distance <= siege_range) || (!isSiege && distance <= tank_range))
{
Instantiate(explosionPrefab, collider.transform.position, Quaternion.identity);
Destroy(collider.gameObject);
//공성 모드가 아니면, isMoving을 false로 설정
if (!isSiege) isMoving = false;
}
}
yield return null;
}
private void OnDrawGizmos()
{
//기즈모 그리기
//탐지 범위 보여주기
Gizmos.color = Color.red;
//기즈모 원그리기 시즈모드 일때 시즈범위 / 아니면 탱크 범위
Gizmos.DrawWireSphere(transform.position, isSiege ? siege_range : tank_range);
}
}
Gizmos.DrawWireSphere 는
Gizmos 클래스의 정적 메서드로,
씬 뷰에서 와이어프레임 구를 그리는 기능을 제공합니다.
이 메서드는 OnDrawGizmos 또는 OnDrawGizmosSelected 콜백 함수에서 사용할 수 있습니다.
이 메서드는 구의 중심점과 반지름을 매개변수로 받습니다.
예를 들어, 다음 코드는 선택된 오브젝트의 위치에 반지름이 1인 와이어프레임 구를 그립니다.
void OnDrawGizmosSelected()
{
// Display the explosion radius when selected
Gizmos.color = Color.white;
Gizmos.DrawWireSphere(transform.position, 1f);
}
Physics2D.OverlapPoint 는
월드 공간에서 콜라이더가 특정 점과 겹치는지 확인하는 함수입니다.
이 함수는 찾은 콜라이더의 수를 반환하고, 결과 배열에 그 콜라이더들을 저장합니다.
결과는 contactFilter 로 필터링할 수도 있습니다.
https://docs.unity3d.com/ScriptReference/Physics2D.OverlapPoint.html
Unity - Scripting API: Physics2D.OverlapPoint
The optional layerMask allows the test to check only for objects on specific layers. Although the Z axis is not relevant for rendering or collisions in 2D, you can use the minDepth and maxDepth parameters to filter objects based on their Z coordinate. If m
docs.unity3d.com
https://docs.unity3d.com/ScriptReference/Physics2D.OverlapPointAll.html
Unity - Scripting API: Physics2D.OverlapPointAll
Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close
docs.unity3d.com
'게임개발 > 게임플랫폼 응용 프로그래밍' 카테고리의 다른 글
벡터의 연산1 (0) | 2024.03.04 |
---|---|
시즈탱크 4단계 (0) | 2024.03.02 |
코루틴 연습 3 (0) | 2024.03.01 |
코루틴 연습 2 (0) | 2024.03.01 |
Coroutine 코루틴 (0) | 2024.03.01 |