이동방식을 구현할 때 Addforce나 Velocity를 주로 사용한다.
둘의 차이가 뭘까
Addforce: 가해지는 힘을 누적하여 속도를 증가시키고, 이동 물리 질량 관성의 영향을 받는 메소드
Velocity: 속도를 나타내주는 변수이므로, 질량 관성은 무시하고 주어진 속도로 이동하는 이동변수
이다
확대는 못했지만 Velocity는 관성이 거의 없는 느낌으로 누르는만큼 딱딱 멈추지만, Addforce쪽은 마찰이 없는 것 처럼 슥슥 미끄러지는 영향을 많이 받은 상태를 확인할 수 있다.
Addforce를 사용한 코드는
if (Input.GetKey(KeyCode.W))
{
Player_r.AddForce(0, 0, speed);
}
if (Input.GetKey(KeyCode.A))
{
Player_r.AddForce(-speed, 0, 0);
}
if (Input.GetKey(KeyCode.S))
{
Player_r.AddForce(0, 0, -speed);
}
if (Input.GetKey(KeyCode.D))
{
Player_r.AddForce(speed, 0, 0);
}
로, 키의 입력을 받으면 그쪽 방향으로 speed를 addforce해주었다.
이러면 문제점이 최대값을 안정해두었기에 계속 값이 누적된다.
Velocity를 사용한 코드는
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 value = new Vector3(x, 0, z) * speed;
Player_r.velocity = value;
를 사용했고, 움직이는 물체의 velocity값을 바꿔주는 식이다.
총알을 발사하는 bullet Spawner를 만들었다.
총구를 나타내기 위한 cube와 그 앞에 총알이 만들어질 포지션을 잡을 here empty object를 만들었다.
[SerializeField] private float rotateSpeed = 50.0f; //돌리는 속도
private Vector3 Direction = new Vector3(0, -1, 0); //돌리는 방향
private void Update()
{
transform.Rotate(Direction, Time.deltaTime * rotateSpeed);
}
bullet Spawner에 위의 식을 넣어주면 계속 도는데, 부딪힌 벽이 너무 가까이 있으면 다시 반대 방향으로 돌게 만들었다.
RaycastHit rayObject;
if (Physics.Raycast(transform.position, transform.forward, out rayObject))
{
if (rayObject.transform.tag == "Wall" && rayObject.distance < 3.5f)
{
Direction.y *= -1;
}
}
raycasthit이 있고, 벽과 부딪혔으며 거리가 짧다면 direction의 y를 반대로 돌려 와리가리 도리도리 하게 만들었다,
총구가 플레이어를 향할 때 총알을 만드는 식을 코루틴으로 만들어보자.
if (rayObject.transform.tag == "Player" && !isFire)
{
isFire = true;
StartCoroutine("coMakeBullet");
}
IEnumerator coMakeBullet()
{
GameObject bullet = Instantiate(bulletPrefabs, here.position, transform.rotation);
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * bulletSpeed;
Destroy(bullet, 3f);
yield return new WaitForSeconds(0.5f);
isFire = false;
}
위에처럼 해두면 makeBullet 코루틴을 시작하고, 0.5초가 끝나기 전까지 isFire은 계속 true이고, 0.5초가 지난 후에는 isFire이 False가 되어 if문에 다시 들어가 총알을 발사할 수 있다.
히히
2D | 3D | 2.5D |
Sort, Layer | Z축 | |
원근 X | 원근 O / X 가능 (Projection - Orthographic (X), Perspective (O)) |
Raycast Collider
Rigidbody 불필요, Collider 필요 | Rigidbody 필요, Collider 필요 |
레이저를 쏘고 닿는 물체를 검출 (움직이지 않아도 검출 가능, 두 개 같이 코스트 발생 X) | 물체가 닿을 때 검출 (둘 중 하나가 움직여야 닿는다, 두 개 같이 코스트 발생) |
'공부 > Unity' 카테고리의 다른 글
[Unity] Unity event와 C# event의 차이점 (0) | 2023.05.01 |
---|---|
[Unity] Renderer Pipe Line - HDRP와 URP와의 차이점 (0) | 2023.04.28 |
[Unity] 커비 미완성 내용들 (디디디 대왕 AI 넣어주기) (1) | 2023.04.24 |
[Unity] 내맘대로 별의 커비 DS에 디스커버리 능력 넣기 (0) | 2023.04.21 |
[Unity] 커비 7일차 생명 UI, 상태 패턴, 일시정지중에 애니메이션 작동 (0) | 2023.04.19 |