다운로드후 모든걸 import한다 총탄충돌효과 말고도 나중에 배럴을 폭파할 효과도 필요하기 때문이다
import후 다음같은 폴더내에 sparksEffect.prefab을 Prefabs폴더로 옮겨주고 하이라키나, 씬뷰에 끌어다 주면 불꽃튀는 효과가 보인다.
스파크효과는 총알이 벽에 충돌했을때 발생한 스파크 효과는 RemoveBullet 스크립트에서 구현한다. RemoveBullet스크립트를 다음과 같이 수정한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RemoveBullet : MonoBehaviour
{
public GameObject sparkEffect;
private void OnCollisionEnter(Collision coll) {
if(coll.collider.tag == "Bullet") {
Instantiate(sparkEffect, coll.transform.position, Quaternion.identity);
Destroy(coll.gameObject);
}
}
}
Wall Prefab인스펙터창의 RemoveBullet스크립트컴포넌트의 sparkEffect참조를 끌어다 연결한다. 실행하기전 하이리키의 Bullet와 sparkle은 지운다.
실행해보면 충돌각도에 관계없이 스파클의 각도가 고정되어 있다. 이유는 sparksEffect를 만들때 Instantiate( , , Quaternion.identity)로 sparksEffect의 원래각도로 만들어서 그렇다.
따라서 충돌한 지점에서 법선 벡터를 구해 해당 방향으로 스파크가 튀게 변경해보자, 법선 벡터는 두 물체가 충돌한 평면 또는구면의 점접에서 수직 방향으로 바라보는 벡터를 말한다.
RemoveBullet 스크립트를 다음과 같이 수정해 Bullet과 Wall의 정확한 충돌 지점과 해당 접점에서의 법선 벡터를 구해 스파크 파티클을 회전시켜보자
Instantiate()의 세번째 인자는 각도를 서정하며 Quatenion타입이다. Vector3()를 넣면 안된다.
다음 스크립트를 보면 충돌지점 정보는 Collision.GetContact, GetContacts함수를 통해 알수 있다.
ContactPoint cp = coll.GetContact(0);
충돌지점으로 리턴되는 ContactPoint의 프라퍼티는 다음과 같다.
normal | Normal of the contact point. |
otherCollider | The other collider in contact at the point. |
point | The point of contact. |
separation | The distance between the colliders at the contact point. |
thisCollider | The first collider in contact at the point. |
Quaternion rot = Quaternion.LookRotation(-cp.normal); //충돌한 총알의 법선 벡터를 쿼터니언 타입으로 변환
Quaternion.LookRotation()의 정의를 보면 Vector라 cp.normal (노말벡터)를 넣는다.
public static Quaternion LookRotation(Vector3 forward) {
return LookRotation(forward, Vector3.up);
}
cp.normal (노말벡터)는 충돌체의 진행방향이라고 생각하는게 편할듯하다. 이펙트는 총알의 반대방향으로 되야하니 -를 곱하고 쿼터니언으로 바꿔 rot에 넣는다. 이 rot를 이용해 이펙트를 초기화 한다.
사실 총알의 진입방향의 반대라는게 생각하면 이상하다. 벽에 부딪치면 반사되서 반대방향으로 가는 효과는 아닌거다. 이건 나중에 생각하자.
실행해보면 총알의 입사각의 반대로 스파크 효과가 난다. 그러나 없어지지 않는다.
SparksEffect 프리팹을 씬뷰에 끌어다 놓고 하이라키에서 눌러 보면 다음과 같이 3개의 효과가 들어 있다.
위에서 부터 순서대로 눌러 인스펙터뷰에서 Duration은 2 Loop는 꺼준다.
맨마지막꺼는 루프만 꺼주었다.
이렇게 하면 효과는 2초후 꺼지지만 하이라키뷰에서 오브젝트이름은 사라지지 않는다. 따라서 스크립트에서
Instantiate()이후 Destroy(spark,0.5f)로 0.5초후에 파괴되라고 예약을 걸었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RemoveBullet : MonoBehaviour {
public GameObject sparkEffect;
private void OnCollisionEnter(Collision coll) {
if (coll.collider.CompareTag("Bullet")) {
//첫번째 충돌 지점의 정보추출
ContactPoint cp = coll.GetContact(0);
//충돌한 총알의 법선 벡터를 쿼터니언 타입으로 변환
Quaternion rot = Quaternion.LookRotation(-cp.normal);
// 스파크 파티클을 동적으로 생성, 총알의 법선벡터의 반대방향으로
GameObject spark = Instantiate(sparkEffect, cp.point, rot);
//충돌한 오브젝트제거
Destroy(spark,0.5f);
Destroy(coll.gameObject);
}
}
}
'유니티게임강좌 > 총 발사 로직' 카테고리의 다른 글
[총발사로직] 텍스처 변경하기 - Mesh Rendere (0) | 2023.03.01 |
---|---|
[총발사로직] 폭발 효과및 폭발력 생성 (2) | 2023.03.01 |
[총발사로직] 총알 발사 궤적 효과 만들기 - Trail Renderer (0) | 2023.02.28 |
[총발사로직] 총알 발사 로직 (0) | 2023.02.27 |
[총발사로직] Tag활용 (0) | 2023.02.27 |