34-40 총알쏘는 Enemy 만들기
34 총알쏘는 Enemy 만들기
35 EnemyShooter 클래스 생성 및 Start 함수 정리
36 적 총알 발사
37 적 총알과 플레이어 충돌처리 1
38 적 총알과 플레이어 충돌처리 2
39 적 총알과 DestroyZone 충돌처리
40 총알 사운드 적용하기
동적 리소스 만들기 - Resources 폴더 (빌드는 필요파일만 가져오지만 리소스폴더에 넣게 되면 제거를 해주지 않는다 / 코드 상에서 동적으로 리소스 해야하는 것들만 넣기)
Resources.Load 함수 https://learnandcreate.tistory.com/753
유니티에서 Resources.Load 함수를 사용하여 에셋 로드하기
유니티에서 Resources.Load 함수를 사용하여 에셋 로드하기 Resource 폴더는 유니티가 특별한 목적으로 예약한 폴더 중 하나로 해당 폴더에 에셋을 위치시키면 load함수를 사용하여 불러오기할수있
learnandcreate.tistory.com
Build 빌드 : 실행할 수 있는 파일로 만든다 (expt , apk) -> 내부 테스트를 하겠다
적 -> 총알을 쏘게 만든다
보스 총알 패턴은 어떻게 만드는가
적 총알
- mission 1-
50% 확률로 타겟쪽으로 총알을 쏘는 적을 만든다.
1. 새로운 적을 만든다 (총알을 쏘는 적)
2. EnemyGOD가 50% 확률로 1번 적을 만든다.
1. 적이 총알을 쏘게 하고 싶다
(구현)
1. Enemy Perfab 가져온다.
2. Prefab Unpack (부모만 끊기) - Prefab 재활용 할 수 있다.
3. 새로운 비행기 Prefab Model을 넣고 기존 Prefab의 Copy Component를 한다 -> Paste Component Values
4. Enemy Script 복제 - EnemyShooter 생성 (Class name 변경)
5. PlayerFire Script 에서 가져온 코드 - GameObject bullet = Instantiate(bulletFactory);
//아래로 계속 이동하고 싶다.
//필요속성 : 이동속도
//타겟을 따라다니기
//필요속성 : 타겟
//죽을 때 폭발효과를 발생시키고 싶다.
//필요속성 : 폭발효과 공장
public class LHS_EnemyShooter : MonoBehaviour
{
// 필요속성 : 이동속도
public float speed = 5;
// 필요속성 : 타겟
public Transform target;
// 방향
Vector3 dir;
// 필요속성 : 폭발효과 공장
GameObject explosionFactory;
void Start()
{
// 동적으로 폭발효과를 로딩하고 싶다.
explosionFactory = (GameObject)Resources.Load("Prefabs/Explosion");
// 방향 설정하기 - 방향 함수 선언
SetDirection();
// 총알 쏘기
ShootBullet();
}
// 1. 방향을 정한다
void SetDirection()
{
GameObject player = GameObject.Find("Player");
// 만약 타겟이 있다면
// if(Player != null)
if (player)
{
target = player.transform;
// 70% 확률로 아래로 방향을 잡고
// 1. 확률을 구해야 한다.
int randomic = Random.Range(0, 10);
// 타겟 방향으로 설정하기
// 2. 확률이 70%에 속했으니까
if (randomic < 7)
{
dir = Vector3.down;
}
// 그렇지 않으면
else
{
//타겟쪽으로
dir = target.position - transform.position;
dir.Normalize();
}
}
else
{
dir = Vector3.down;
}
}
// 타겟쪽으로 총알을 발사하고 싶다.
// 필요속성 : 총알공장
public GameObject bulletFactory;
void ShootBullet()
{
// 만약 타겟이 없으면 총알 안쏜다
if (target == null)
{
return;
}
// 타겟쪽으로 총알을 발사하고 싶다.
GameObject bullet = Instantiate(bulletFactory);
// 총알의 방향을 구하고
Vector3 dir = target.position - transform.position;
// 총알을 타겟 방향으로 회전시켜주기
bullet.transform.up = dir;
// 총알이 생성될 위치 지정
bullet.transform.position = transform.position;
}
// 2. 이동하고 싶다
// P = P0 + vt
void Update()
{
transform.position += dir * speed * Time.deltaTime;
}
// 다른 물체와 부딪혔을 때 걔도 죽고 나도 죽고
private void OnCollisionEnter(Collision collision)
{
// 폭발효과 발생시키기
GameObject explosion = Instantiate(expolosionFactory);
explosion.transfrom.position = tranfrom.position;
// 만약 부딪힌 녀식이 Bullet이라면
if (collision.gameObject.name.Contains("Bullet"))
{
// 탄창에 집어 넣고 싶다.
// PlayerFire에 있는 탄창에 총알을 넣어줘야한다.
// 1. Player 게임 오브젝트가 필요하다
// 2. PlayerFire 가 필요하다
PlayerFire player = target.GetComponent<PlayerFire>();
// 3. 탄창에 총알을 넣어준다
player.bulletPool.Add(collision.gameObject);
collision.gameObject.SetActive(false);
}
else
{
PlayerHealth.Instance.HP--;
}
Destroy(gameObject);
}
}
6. 총알 만들기 Cube (EnemyBullet)
7. 총알 Script (EnemyBullet)
// 자기가 향하는 방향으로 이동하고 싶다.
public class LHS_EnemyBullet : MonoBehaviour
{
public float speed = 5;
void Start()
{
}
void Update()
{
// 지가 향하는 방향으로 이동하고 싶다.
// P = PO + vt
transform.position += transform.up * speed * Time.deltaTime;
}
}
8. EnemyBullet - Prefab으로 만들기
9. Enemy에 EnemyShooter Script 붙이고 EnemyBullet 넣기
10. Enemy와 EnemyBullet 충돌을 하면 안됨 -> EnemyBullet - Layer(Enemy로 변경)
<발생오류> 30% 확률로 target을 향해 감으로 target으로 이동할 시 총알과 같이 이동하는 것처럼 보인다
-> 개인 : 방향 정하는 코드 변경 (아래로만 간다)
-> 강사님 : EnemyBullet 속도를 올린다
2. 적 총알과 플레이어가 닿으면 충돌하고 싶다
1. EnemyBullet에 rigidbody 붙여준다. (Use Gravity는 끄기)
2. EnemyBullet Script - Enemy 폭발효과 가져오기
// Enemy 폭발효과
private void OnCollisionEnter(Collision collision)
{
// 폭발효과 발생시키기
GameObject explosion = Instantiate(expolosionFactory);
explosion.transfrom.position = tranfrom.position;
}
3. EnemyBullet Script
// 자기가 향하는 방향으로 이동하고 싶다.
public class LHS_EnemyBullet : MonoBehaviour
{
public float speed = 5;
Public GameObject explosionFactory;
void Start()
{
}
void Update()
{
// 지가 향하는 방향으로 이동하고 싶다.
// P = PO + vt
transform.position += transform.up * speed * Time.deltaTime;
}
// Enemy 폭발효과
private void OnCollisionEnter(Collision collision)
{
// 폭발효과 발생시키기
GameObject explosion = Instantiate(expolosionFactory);
explosion.transform.position = transform.position;
// 너도 죽고 나도 죽고
Destroy(collision.gameObject);
Destroy(gameObject);
}
}
4. EnemyBullet - Explosion Factory 넣기
3. EnemyGOD가 50% 확률로 1번 적을 만든다
1. 내가 만든 총알을 Prefabs로 만든다
2. EnemyGOD에서 EnemyFactory를 Enemy로 할 것 인지 / LHSEnemy로 할 것인지 선택할 수 있게 만들어야 한다
3. EnemyGOD Scripts