인프런 커뮤니티 질문&답변

coffeecat0213님의 프로필 이미지

작성한 질문수

[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템

목표 검색을 위한 TargetSearcher와 Skill 범위 표시를 위한 Indicator

막힌 부분이 있어 질문드립니다

해결된 질문

24.07.11 16:18 작성

·

205

·

수정됨

0

인디케이터가 원뿔형으로 하였을 때 중앙이 마우스 커서를 향하게 회전하게 할려면 어떻게 해야 하나요??
private void RotateTowardsMouse()

{

Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

mousePosition.z = 0;

Vector3 direction = mousePosition - transform.position;

float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));

}

2d 환경에서 인디케이터 코드에 이 코드를 추가하여 update에서 실시간으로 회전하게 만들었는데
문제가 90도 일때는 45도 지점이 마우스 커서 방향을 향하게 되는데
180도는 0도 지점
270도일때는 135지점에 마우스커서가 향하게 할려했는데 315도 지점에 마우스커서가 향하게 됩니다

실제로 탐색하는 부분인 searchArea 코드에서는
ector2 requesterPosition = requesterObject.transform.position;

Vector2 searchDirection = requesterObject.transform.forward;

if (isRotateWithMouse)

{

Vector2 mouseWorldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

searchDirection = (mouseWorldPosition - requesterPosition).normalized;

}
//
중략

//
if (Vector2.Angle(searchDirection, direction) < (angle * 0.5f))

targets.Add(entity.gameObject);

이렇게 수정하였는데 이쪽은 원하는 범위를 제대로 탐색합니다

요약하자면은 실제 탐색범위는 원하는 범위를 탐색을 하는데
인디케이터의 범위가 실제 탐색범위와 일치하지 않습니다.
제가 실력이 아직 부족하여 문제점을 제대로 해결하지 못해 질문드립니다.

답변 3

1

Developer G님의 프로필 이미지
Developer G
지식공유자

2024. 07. 12. 09:56

수강해주셔서 감사합니다.
개인 사정으로 답변이 늦어진 점 죄송합니다.

2D의 경우

Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.up = mousePosition - (Vector2)transform.position;

위 2줄의 Code로 믈체가 Mouse Position을 바라보게 만들 수 있습니다.
객체에서 Mouse로의 방향을 구해서 객체의 Up Vector(Y축)로 설정해줍니다.
Sprite가 오른쪽을 바라보고 있다면 transform.right에 방향을 넣어주면 됩니다.

Mouse 위치를 기준으로 Target이 범위 안에 있는지(Search)는 다음과 같이 확인할 수 있습니다.

Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Requester Entity에서 Mouse로의 방향을 구함
Vector2 directionToMouse = mousePosition - requesterObject.transform.position;
// Requester Entity에서 Target Entity로의 방향을 구함
Vector2 directionToTarget = targetPosition - requesterObject.transform.position;

// Target이 Mouse 위치를 기준으로 angle안에 들어와있는지 확인
if (Vector3.Angle(directionToMouse, directionToTarget) < (angle * 0.5f))
// Target이 범위 안에 있으니 그에 따른 처리

위 Code로 작성된 예제 모습입니다.

1. 객체 회전과 Target Search 동시 진행
image
2. Target Search만 진행
image
감사합니다.

coffeecat0213님의 프로필 이미지
coffeecat0213
질문자

2024. 07. 16. 14:11

감사합니다 이런방법도 있군요

0

coffeecat0213님의 프로필 이미지
coffeecat0213
질문자

2024. 07. 11. 17:26

transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));



transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle+(Angle-90f)));

로 수정해서 해결했습니다.
혹시 문제되는 부분이나 더 좋은 방법이 있으시다면 알려주시면 감사하겠습니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 11. 16:21

안녕하세요, 인프런 AI 인턴입니다. coffeecat0213님.

질문 주신 내용을 기반으로, 유니티 2D 환경에서 마우스 커서를 향해 객체가 회전하도록 하는 문제와 관련하여 구체적으로 동일한 상황을 다룬 게시글이 없음을 확인했습니다. 하지만, 커서 위치에 따른 객체 회전과 관련된 기본 원리와 문제 해결 방식을 고려할 때, 유니티에서 transform.rotationQuaternion.Euler을 사용하여 2D 객체의 회전 처리하는 방법에 대해 조금 더 설명 드릴 수 있겠습니다.

코드에서 주어진 RotateTowardsMouse 함수는 마우스 포인터의 방향으로 객체를 회전시키는 로직으로 보입니다. Mathf.Atan2를 사용하여 얻은 각도를 Quaternion.Euler에 적용해 객체의 회전을 조절하는 방식이 일반적입니다. 이 과정에서 특정 각도에서 원하지 않는 방향으로 회전하는 문제는 각도 계산의 방식 또는 객체의 축 설정에 따른 문제일 수 있습니다.

원하는 방향으로 회전이 정확하게 이루어지지 않는 경우, 객체의 초기 회전 상태나 Quaternion.Euler에서 사용하는 각도가 World Space 또는 Local Space 기준으로 올바르게 적용되었는지 확인해보는 것이 중요합니다.

또한, 인디케이터의 범위와 실제 탐색 범위가 일치하지 않는 문제는 회전 로직 외에도 인디케이터를 그리는 방식이나 탐색 로직에 차이가 있는지 검토해보아야 합니다. 예를 들어, 인디케이터가 그려지는 방식이 실제 객체의 회전 방향과 완벽하게 동기화되어 있는지, 탐색 범위 계산 시에 사용되는 각도와 벡터가 정확히 일치하는지 등을 점검해볼 필요가 있습니다.

이에 관한 정확한 개념과 보다 상세한 해결 방안을 얻고자 한다면, 유니티 공식 문서에서 Quaterniontransform.rotation 부분을 참고하시는 것이 도움이 될 것입니다. 또한, 유니티 관련 커뮤니티나 Stack Overflow에서 비슷한 문제를 경험한 다른 개발자들의 질답을 찾아보는 것도 좋은 방법입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.