728x90
- 주제
>> 아크탄젠트(예제 4개)
- 플레이어를 마우스 커서의 위치로 회전
- 총알을 설정된 방향으로 발사
- 적 캐릭터가 특정 타겟을 향해 회전하여 이동
- 랜덤한 방향으로 주변을 배회하는 캐릭터
- 공부내용
>> 아크탄젠트는 언제 사용하는가?
두 오브젝트 간의 상호작용을 구현하기 위해 사용한다.
예를 들어, 플레이어와 마우스 두 오브젝트의 관계를 정의할 때,
마우스 커서의 위치에 따라 플레이어가 회전하는 코드를 구현하고 싶을 때 사용한다.
- 예제 1 : 플레이어를 마우스 위치로 회전시키기
플레이어의 위치와 마우스의 위치 사이의 방향을 계산하고, 이 방향의 각도를 구한 후,
플레이어를 해당 각도로 회전시킨다.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Update()
{
// 플레이어 위치와 마우스 위치 사이의 방향 벡터 계산
Vector3 direction = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position);
// 방향 벡터를 각도로 변환하여 플레이어를 회전시킴
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
}
}
- 예제 2 : 총알을 설정된 방향으로 발사하기
총알의 초기 방향을 설정하고, 이 방향의 각도를 계산하여 해당 방향으로 총알을 발사한다.
using UnityEngine;
public class BulletController : MonoBehaviour
{
public float speed = 10f;
void Start()
{
// 총알의 현재 방향을 계산
Vector2 direction = new Vector2(1, 0); // 예시로 오른쪽 방향으로 설정
// 방향 벡터를 각도로 변환하여 총알의 이동 방향을 설정
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
GetComponent<Rigidbody2D>().velocity = Quaternion.Euler(0, 0, angle) * Vector2.right * speed;
}
}
- 예제 3 : 적 캐릭터를 플레이어 위치로 이동시키기
using UnityEngine;
public class EnemyController : MonoBehaviour
{
public Transform player;
public float moveSpeed = 5f;
void Update()
{
if (target != null)
{
// 플레이어와 자신의 위치 차이를 계산하여 방향 벡터를 구함
Vector3 direction = player.position - transform.position;
// 방향 벡터를 각도로 변환하여 플레이어를 향해 회전
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
// 플레이어 방향으로 이동
transform.position += direction.normalized * moveSpeed * Time.deltaTime;
}
}
}
- 예제 4 : 랜덤한 방향으로 주변을 배회하는 캐릭터
using UnityEngine;
public class Wanderer : MonoBehaviour
{
public float moveSpeed = 3f;
private Vector3 randomDirection;
void Start()
{
// 초기 랜덤 방향 설정
RandomizeDirection();
}
void Update()
{
// 일정 시간마다 방향을 랜덤으로 변경
if (Time.time % 2f < 0.1f) // 매 2초마다 변경 (캐릭터에 따라 조절 가능)
{
RandomizeDirection();
}
// 설정된 방향으로 이동
transform.position += randomDirection.normalized * moveSpeed * Time.deltaTime;
// 이동 방향으로 회전
float angle = Mathf.Atan2(randomDirection.y, randomDirection.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
}
void RandomizeDirection()
{
// 랜덤 방향 설정
randomDirection = new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), 0f);
}
}
728x90
반응형
'유니티' 카테고리의 다른 글
Day 27 - 플레이어를 둘러싼 적 생성(Mathf.Cos & Mathf.Sin) (0) | 2024.05.16 |
---|---|
Day 26 - Player Input System을 이용한 이동 및 점프 구현 (2) | 2024.05.14 |
Day 24 - C# (인스턴스 생성자 예제 1, 2) (0) | 2024.05.11 |
Day 23 - 탑뷰게임 만들기(InputField) (0) | 2024.05.10 |
Day 22 - 탑뷰게임 만들기(플레이어를 따라가는 카메라) (0) | 2024.05.09 |