전체 글 134

[슈팅 알고리즘] Chapter 2. 탄환 (원형탄)

2.10 원형탄 360도 전 방향으로 탄환을 발사하는 원형탄을 구현할 때에도 방향탄을 응용하면 된다 void InitCircleBullets( int n, // 탄환의 수 float speed, // 탄환의 속도 bool odd, // 홀수 패턴일 때: true float vx[], float vy[] // 원형탄의 속도 벡터 ) { // 탄환과 탄환 사이의 각도를 계산하기 float rad_step = M_PI * 2 / n; // 최초의 탄환의 각도를 계산하기 // 홀수 패턴일 경우 0에서 rad_step/2만큼 회전해 줌 float rad = odd ? rad_step / 2 : 0; // speed의 속도로 각도 rad 방향으로 날아가는 탄환의 속도 벡터 구하기 for (int i = 0; i <..

[슈팅 알고리즘] Chapter 2. 탄환 (n-way탄)

2.9 n-way탄 n-way탄이란 부채꼴 모양으로 발사되는 탄환을 말한다 이를 발사하기 위해서는 방향탄을 응용하여, 중심선을 향해 날아가는 탄환을 기준으로 θ만큼 틀어가며 발사하면 된다 void RotateVelocity( float theta, // 회전각도 float vx0, float vy0, // 원래 속도 float& vx, float& vy // 회전 후의 속도 ) { // theta를 라디안으로 변환하여 cos과 sin값 구하기 // -> 삼각함수의 인자로 라디안을 전달해야 하기 때문 float rad = M_PI / 180 * theta; float c = cos(rad), s = sin(rad); // 속도 벡터(vx0, vy0)을 회전시킨 (vx, vy) 구하기 vx = vx0 * c..

[슈팅 알고리즘] Chapter 2. 탄환 (탄환의 위치)

2.7 탄환을 제거하기 탄환의 좌측 상단 좌표를 (x0, y0), 우측 하단의 좌표를 (x1, y1)이라고 하고, 화면 테두리의 좌측 상단 좌표를 (sx0, sy0), 우측 하단의 좌표를 (sx1, sy1)이라고 했을 때 탄환이 화면 밖으로 빠져나갔는지 여부를 확인하는 방법은 아래와 같다 // 탄환이 완전히 화면 밖에 있을 조건 (x1 < sx0 || sx1

[슈팅 알고리즘] Chapter 2. 탄환 (방향탄)

2.4 방향탄 조준탄과 달리 특정 캐릭터를 향해 날아가는 게 아니라 임의의 방향으로 날아가는 탄환 void InitDirectedBullet() { // M_PI: 원주율 vx = cos(M_PI / 180 * theta) * speed; vy = sin(M_PI / 180 * theta) * speed; } 위 공식을 이용하여 각도를 가지고 탄환의 속도 벡터(방향)을 구할 수 있다 탄환을 발사할 때는 위에서 구한 속도 벡터를 좌표에 더해주면 된다 2.5 테이블을 이용한 방향탄 2.4에서는 실수형 데이터를 사용하였는데, 방향 벡터 테이블을 미리 만들어 발사하는 방법을 사용할 수도 있다 // 3의 속도로 16방향으로 향하는 방향탄 void InitDirectedBullet16_3( float& vx, fl..

[슈팅 알고리즘] Chapter 2. 탄환 (조준탄)

2.1 조준탄 (float를 이용해서 탄환을 이동) 적기에서 플레이어의 위치를 향해 발사하는 조준탄 void InitAimingBullet( float mx, float my, // 플레이어 위치 float ex, float ey, // 적 위치 float speed, float& x, float& y, // 탄환 좌표 float& vx, float& vy // 탄환 속도 벡터 ) { x = ex; y = ey; // 플레이어와 적 사이의 거리 float d = sqrt((mx - ex) * (mx - ex) + (my - ey) * (my - ey)); if (d == 0) { vx = 0; vy = speed; } else { vx = (mx - ex) / d * speed; vy = (my - ey..

[C#] 다른 클래스의 코루틴 함수 호출하기

Player player = other.GetComponent(); player.StartCoroutine(coContinousDamage(_damage, 1.0f, 3)); Player 클래스의 코루틴 함수를 위와 같은 방식으로 호출하려고 하면 해당 함수를 찾을 수 없다고 에러가 뜬다 Player player = other.GetComponent(); player.StartCoroutine(player.coContinousDamage(_damage, 1.0f, 3)); 코루틴도 인스턴스명.코루틴명 으로 찾아주어야 해당 코루틴 함수를 찾아서 실행시킬 수 있다

[C#] Dictionary 형태로 json 데이터 파싱하기

{ "enemyStats" : [ { "ID": 1001, "hp": 20, "damage": 35, "moveSpeed": 3, "skillGuage": 20, "objectDropPer": 35 }, { "ID": 1002, "hp": 25, "damage": 30, "moveSpeed": 2, "skillGuage": 15, "objectDropPer": 30 }, { "ID": 1003, "hp": 20, "damage": 30, "moveSpeed": 4, "skillGuage": 25, "objectDropPer": 40 } ] } json 데이터를 준비해 준다 * json은 반드시 단일 오브젝트 형태로 존재해야 하기 때문에 배열을 감싸는 오브젝트를 하나 만들어주어야 한다(위 코드에서는 ene..

[C#] json 데이터 파싱하기

{ "life": "4", "hp": "100", "damage": "7", "moveSpeed": "5" } 우선 json 파일을 준비해 준다 json에서 { } 괄호는 오브젝트고, [ ] 괄호는 배열이라고 생각하면 된다 [Serializable] public class PlayerData { public int life; public int hp; public int damage; public float moveSpeed; } 데이터 틀을 만들어 준다 직렬화를 위해 반드시 위에 [Serializable]을 붙여주어야 한다(using System) 이때 각 변수들의 이름은 json 데이터에서의 각 항목들의 이름과 일치해야 한다 public class DataManager { public PlayerDa..

[Unity] 특정 방향으로 2D 오브젝트 회전시키기

Vector2 dir; transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg); * 유니티는 회전 각도를 나타날 때 쿼터니언을 사용하기 때문에 Vector3가 아니라 Quaternion.Euler를 사용해야 한다. (짐벌락 현상을 방지하기 위함) 2D상에서의 회전은 Z축을 회전시키면 되기 때문에 x와 y의 값은 0으로 고정시켜 둔다 Mathf의 Atan2는 아크탄젠트 함수(역삼각함수)로, y와 x를 가지고 사잇각을 구할 수 있다 * Atan과 Atan2함수가 있는데, Atan 함수는 인자로 float값(y/x)를 받고, Atan2 함수는 인자로 y값과 x값을 각각 받는다. 따라서 Atan 함수는 만약 x가..