대포알이 스테이지 변경이나, 맵 밖으로 나갔을때, 자동으로 삭제되는 코드를 만들어 줄 것이다
대포알 제거
CannonBall
private int wallIndex;
void Start()
{
GameManager.Instance.reGame += Delete;
wallIndex = LayerMask.NameToLayer("Wall");
}
private void OnDisable()
{
GameManager.Instance.reGame -= Delete;
}
void Delete()
{
Destroy(gameObject);
}
private void OnTriggerEnter(Collider other)
{
// Debug.Log("충돌");
Cube contactCube = other.gameObject.GetComponent<Cube>();
if (contactCube != null)
{
// Debug.Log(contactCube.gameObject.name);
contactCube.OnDamage(damage); // 닿은 큐브의 체력 감소
Destroy(gameObject);
}
if(other.gameObject.layer == wallIndex)
{
Destroy(gameObject);
}
}
먼저 reGame 게임이 재개될때의 이벤트에 삭제하는 Delete함수를 추가하여 게임이 끝나는 즉시 대포알이 삭제되게끔 한다.
또한 Wall이라는 레이어를 가진 충돌체와 부딧혔을 때, 삭제될수 있게끔 LayerMask의 NameToLayer를 가져와 삭제한다.
카메라 제어 보완
CameraMovement
void Update()
{
if(GameManager.Instance.myState == GameManager.GameState.START && !brain.IsBlending)
{
Move();
Scroll();
// ChengeTarget();
TargetCheck();
}
}
void Move()
{
if(Input.GetMouseButton(1) && !isMoving)
{
if (myCoroutine != null)
{
StopCoroutine(myCoroutine);
isMoving = false;
}
UIManager.Instance.InActiveSeleteBlock();
InputController.Instance.CancelSelete();
yaw += Input.GetAxis("Mouse X") * Time.deltaTime * sensitivityX;
pitch -= Input.GetAxis("Mouse Y") * Time.deltaTime * sensitivityY;
pitch = Mathf.Clamp(pitch, -30, 80);
Quaternion rotation = Quaternion.Euler(pitch, yaw, 0);
offset = rotation * new Vector3(0,0,-distance);
controllCam.transform.position = target.position + offset;
controllCam.transform.rotation = rotation;
}
}
public void ChengeTarget()
{
//if (Input.GetMouseButtonDown(0) && !InputController.Instance.isSeleting)
//{
if(myCoroutine != null)
{
StopCoroutine(myCoroutine);
isMoving = false;
}
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 카메라로 부터 클릭한 월드좌표까지 광선
if (Physics.Raycast(ray, out hit, Mathf.Infinity, LayerMask.GetMask("Cube"))) // 광선에 맞은 충돌체를 담는다.
{
target = hit.transform;
fallbackTarget.transform.position = target.position;
myCoroutine = StartCoroutine(IChangeTarget());
Debug.Log("타겟 변경");
}
//}
}
IEnumerator IChangeTarget()
{
isMoving = true;
float t = 0;
Vector3 start = controllCam.transform.position;
Vector3 end = target.position + offset;
while(t <= 1)
{
controllCam.transform.position = Vector3.Lerp(start,end,t);
t += Time.deltaTime * cameraMoveSpeed;
yield return null;
}
controllCam.transform.position = target.position + offset;
isMoving = false;
yield return null;
}
먼저 Move함수가 실행되면 타겟변경 코루틴을 중단시킨다.
이 코드는 타겟이 이동중일때, Move 함수에서 약간의 꼬임으로 카메라가 이상하게 움직이는 버그를 방지한다.
ChangeTarget을 보면 먼저 입력을 추가로 받지 않고 호출받는 식으로 변경했다.
InputController의 IsSeleting중일때, 다른 타겟을 눌러 타겟을 변경하지 않기 위해 if문에 isSeleting을 넣었지만 isSeleting이 true인 상태에서 호출되기 때문에 아예 타겟 변경이 안되는 상황이 이루어지기 때문에 InputController에서 호출하기 위해 public으로 접근제한자를 변경했다.
또한 myCoroutine검사로 현재 타겟을 이동하는 상태에서 다시 타겟을 이동하게 되면 그 즉시 타겟이동을 중단하고 다른 타겟으로 이동하게끔 만들어 주었다.
남은 기능은 시인성향상과 디자인
'GameDev > Cubidom' 카테고리의 다른 글
| Cubidom Option창 만들기 - 슬라이더로 카메라 민감도 조절 (0) | 2026.03.30 |
|---|---|
| Cubidom 일시 정지 만들기 (0) | 2026.03.29 |
| Cubidom 대포 자동 에임 시스템 (0) | 2026.03.27 |
| Cubidom 스테이지 시스템 (0) | 2026.03.26 |
| Cubidom Enemy, 카메라,UI 버그 수정 (0) | 2026.03.25 |