유니티로 적들 길찾기 AI 만들고 있는데
적들이 너무 장애물에 잘낍니다.
AI는 별 문제 없다고 칭찬해주던데
진짜 왜 이런지 1도 모르겠습니다.
만약에 유니티에서 주로 끼는 이유를 아는 분은 제발 알려주세요.
일단 혹시 모르니까 A*에 기반한 이동 방식을 표현한 코드도 남겨두겠습니다.
더 필요하시면 아래에 나오는 gridManager랑 FindPath도 코드 올리겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class enemyMovement : MonoBehaviour
{
public LayerMask obstacleLayer;
public Vector2Int PathFindDis;
public GameObject Target;
public float moveSpeed = 1f; // 이동 속도
private int targetIndex; // 현재 목표 지점 인덱스
private Rigidbody2D rb;
public float updateInterval = 0.5f; // 0.5초마다 실행
private float nextUpdateTime = 0f;
private List<Node> path;
private bool isMoving = false;
private Vector3 nextNodeWorldPos;
private Vector2 lastPosition;
private float stuckTimer;
void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update(){
IsStuck();
}
void FixedUpdate()
{
// 1. 이동 중이면 계속 이동 처리
if (isMoving)
{
float step = moveSpeed * Time.fixedDeltaTime;
Vector2 direction = ((Vector2)nextNodeWorldPos - rb.position).normalized;
//Vector2 newPosition = rb.position + direction * step;
rb.linearVelocity = direction * step;
if (Vector2.Distance(rb.position, nextNodeWorldPos) < 0.01f)
{
rb.position = nextNodeWorldPos;
targetIndex++;
if (targetIndex < path.Count)
{
StartMovingToNextNode();
}
else
{
isMoving = false;
}
}
if (path == null || targetIndex >= path.Count)
{
// 목표가 없으면 현재 위치로 이동 시도 (충돌 정상화)
rb.linearVelocity = Vector2.zero;
return;
}
return; // 이동 중이면 여기서 종료
}
// 2. 이동 중이 아니고 시간이 되면 경로 갱신
if (Time.time >= nextUpdateTime)
{
nextUpdateTime = Time.time + updateInterval;
Vector2Int objPos = new Vector2Int(Mathf.FloorToInt(rb.position.x), Mathf.FloorToInt(rb.position.y));
Vector2Int TargetVec = new Vector2Int(Mathf.FloorToInt(Target.transform.position.x), Mathf.FloorToInt(Target.transform.position.y));
GridManager gridManager = new GridManager(objPos, PathFindDis, obstacleLayer);
Pathfinding pathfinding = new Pathfinding(gridManager);
path = pathfinding.FindPath(objPos, TargetVec);
targetIndex = 0;
if (path != null && path.Count > 0)
{
StartMovingToNextNode(); // 여기서 isMoving = true가 됨
}
}
}
void StartMovingToNextNode()
{
Vector2Int gridPos = path[targetIndex].position;
nextNodeWorldPos = new Vector3(gridPos.x + 0.5f, gridPos.y + 0.5f, transform.position.z);
isMoving = true;
}
void IsStuck()
{
if (Vector2.Distance(lastPosition, rb.position) < 0.01f)
{
stuckTimer += Time.deltaTime;
if (stuckTimer > 1f)
{
rb.linearVelocity = Vector2.zero;
TryEscapeStuck();
stuckTimer = 0;
}
}
else
{
stuckTimer = 0;
}
lastPosition = rb.position;
}
bool TryEscapeStuck(float probeDistance = 0.3f, int maxAttempts = 8)
{
Vector2[] directions = {
Vector2.up, Vector2.down, Vector2.left, Vector2.right,
new Vector2(1,1).normalized, new Vector2(-1,1).normalized,
new Vector2(1,-1).normalized, new Vector2(-1,-1).normalized
};
foreach (Vector2 dir in directions)
{
Vector2 checkPos = rb.position + dir * probeDistance;
Collider2D hit = Physics2D.OverlapBox(checkPos, Vector2.one * 0.6f, 0, obstacleLayer);
if (hit == null)
{
rb.position = checkPos;
return true;
}
}
return false;
}
}
네 존나 잘 끼니까 언리얼로 갈아타세요
근데 저번에 질문하는거 보고 느꼈는데 진정한 의미에서 본인이 프로그래밍을 하는게 아닌것같음 로직에 대한 이해가 없는채로 ai, 복붙코딩을 하려는느낌 본인이 올린 코드인데 그에 대한 이해가 없는것같음 이런식이라면 실력은 안늘거고, 알수없는 버그에 고통받게될거임
팩트폭력이긴 한데 맞는 말입니다. 그러면 어떻게 해야하나요?
음. 어떤 방법이든 좋으니 스스로 생각하면서 한번 해봐야겠지. 사실 이렇게 무작정 복붙하고 해보고 안되는 이유 찾고 하는것도 나쁜 방법이라고만은 생각 안해. 다만 커뮤같은데 올리면 질문이 왜이러지 싶어서 사람들이 답변하기가 힘드니깐
@ㅇㅇ(121.135) 일단 이 코드에서 ‘끼임‘을 어디서 담당하는지부터 한번 생각해보셈
음 그러면 무작정 질문하는 것도 주의하도록 하겠습니다 그리고 끼임도 한번 조사해볼께요
@ㅇㅇ(121.135) 이 코드에서는 어떤 부분이 끼임을 담당하고 있는가, 끼었다면 어떤 효과가 나타나는가를 분석해보고. 그러면 끼임을 판별하는 조건문이 있을텐데 그 원리를 분석해보고나면 더 잘끼게 만든다든지, 잘 안끼게 만든다든지 하는건 쉽지 않을까
끼임이라는 문제를 자세하게 정의해야해 그래야 풀 수 있지
끼임이 문제면 escape 쪽이 문제겠지
흠 2D엔 만능 내장 캐릭터컨트롤러가 없군 ㄲㅂ;
유니티가 문제일 리는 없고 플밍이나 엔진 이해 없이 AI에 묻기만 해선 끝없이 새로운 문제에 막힐 거임
엔진 이해를 위해서 이제는 Ai를 사용해보겠습니다
유니티 물리 줫구린건 팩트이지만 사람손을 거치면 어캐든 작동함. 단지 그 선을 넘어서 아예 엔진에 의존안하는게 맞는경우가 더러 발생 예를 들면 이번에 릿지레이서 프로토타입나온게 딱 유니티 코딩한 느낌이남. 물리가 개판 씹창나는데 그걸 해결하려면 수작업으로 다시 리뉴얼하던가 프로토타입에서 때려치우든가 유니티에 대한 환상을 접는게 나음.
내가 ai 쓸이유도없고 안쓰고 미래에도 별 가치없는 거품이라고 보는이유가 게임개발이 양산된 기술에서 보완해야 양질의 퀄리티가 나오는데 ai는 엔진 양산 코딩만도 못한다 수작업> 양산코딩>ai코딩. ai는 딱 웹개발노가다용 그이상못감.
본인이 겪는 문제를 갤에 있는 인간한테도 설명을 제대로 못 하는데 AI한테 컨텍스트를 제대로 전달할 수 있을까
길찾기 코드를 가져와야지 근데, 대각선 이동있으면 무조건 거기가 문제일거임 - dc App
isstuck 이랑 try escape 이거지우셈, 끼이는걸 고쳐야지 이런식으로 코딩하면 어차피 나중에 에러만 더생김 - dc App
질문 수준 보니까 유니티가 뭐고 코딩은 뭔지에 대한 이해도가 0에 가까운 거 같은데? "자동차가 원래 이렇게 사고가 잦은 교통수단인가요? 네비게이션은 A*이란 걸 쓰고 있어요" 수준의 질문임 니가 운전을 못하니까 사고가 나는 건데 운전하는 법 익힐 생각도 의지도 없으면서 자동차운전은 하고 싶은 모순적인 상태가 지금의 너임 - dc App