코드네임 :

슈팅게임 - #2 총알이동, 적 이동 본문

프로그래밍/Unity(C#)

슈팅게임 - #2 총알이동, 적 이동

비엔 Vien 2023. 7. 6. 15:54

총알이동 스크립트

 

총알 오브젝트 Cube로 생성 (이름 : Bullet)

 


 

총알 스크립트 Bullet.cs

Bullet 오브젝트에 적용시키기

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 5;// public 쓰는 이유 : Inspector 창에 해당 매개변수의 초깃값을 노출시켜서 사용자가 원하는 값으로 바꾸는 것이 가능하게 하려고 

    void Update() // update함수에서 방향을 구하게(입력받아 출력..?) 됨 
    {
        Vector3 dir = Vector3.up;  // 방향 구하기
        transform.position += dir * speed * Time.deltaTime; // 총알을 초당 5유닛만큼 이동시킴 (실행시키면 총알 오브젝트가 자동으로 위로 이동) 
        
    }
}

 

PlayerFire.cs

✔︎ Player오브젝트에 적용시키기

하나의 오브젝트에 여러개의 Script를 적용시킬 수 있다!!

        ...
        
public class PlayerFire : MonoBehaviour
{
    public GameObject bulletFactory; // 총알
                                     // bulletFactory : 총알의 PreFab
                                     // 이걸 Instantiate로 복제해서 계속 똑같은 총알을 만들거래

    public GameObject firePosition; // 발사 위치 
    
        ...

}

PreFab (Pre Fabrication)

 

PreFabs 폴더 : 미리 만들어진 오브젝트(부속품), 어떤 기능들을 미리 만들어서 넣어놓은 곳 (Pre Fabrication)

 

PreFab 만드는 법:

Hierarchy 창에서 Object를 끌어다가 Project안의 아무 폴더 안에다가 넣으면 됨 (우린 이 폴더를 PreFabs라고 하기로 했음)

 

 

✔︎ Bullet 오브젝트를 PreFabs 폴더에 끌어다놓는다 

    ▶ Bullet이 파랗게 변했는데 이것이 바로 PreFab가 되었다는 뜻!

 

 

 

✔️ 총알이 처음부터 화면에 있으면 안되니까 Delete로 제거 

 

 

 

✔️ Bullet 프리팹을 Player의 BulletFactory프리팹에 끌어다가 넣어서 끌어다가 넣어서 적용 

 


 

✔︎ Player 오브젝트 안에 FirePosition 오브젝트 생성 후 FirePosition 프리팹에 적용

 

 

 

✔︎ Fire Position의 y위치를 1로 변경 (즉 FirePosition은 (0, 1, 0)에 위치 )

 


 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 버튼을 누르는 순간 총알오브젝트(Bullet)를 생성하는 메소드 - 인스턴시에이트 ?
// 총알이 여러발 나가야 함으로 총알을 복사해주는 프리팹??

public class PlayerFire : MonoBehaviour
{
    public GameObject bulletFactory; // 총알
                                     // bulletFactory : 총알의 프리팹 ..?
                                     // 이걸 복제해서 계속 똑같은 총알을 만들거래

    public GameObject firePosition; // 발사 위치 

    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetButtonDown("Fire1")) // GetButtonDown : 어떤 버튼이 눌러져 있는가?(마우스 버튼) (버튼을 누른 그 순간에 한번만 작동)
        {
            GameObject bullet = Instantiate(bulletFactory); // Instantiate : 프리탭옵젝()을 복제 (즉 여기서는 bulletFactory를 복제)
                                                            // 이렇게 복제된 옵젝은 return값으로 들어오게 되는데 그거를 이제 지역변수인 bullet에다가 넣어줌

            bullet.transform.position = firePosition.transform.position; // bullet의 초기 위치
                                                                          // bullet옵젝의 위치를 FirePosition옵젝의 위치(0,1,0)로 이동 
        } 
    }
}

⬇️ 실행 결과  

 

 

 

 

 

 


 

 

적이동 스크립트

 

Cube (Enemy)


Enemy.cs

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float speed = 5;
    // Start is called before the first frame update
    void Start()
    {
        
    }

 


 

충돌처리 위해 RigidBody 사용!!!

✔︎ Enemy오브젝트 ▶ inspector ▶ Add Component(맨 아래에 있음) 누르기 ▶ 아래 사진처럼 rigidbody 입력해서 누르삼 

✔︎ Rigidbody의 Gravity 꼭 꺼주기!! (안 꺼주면 아래로 내려오는 Enemy가 Player object?를 통과 못함)

 

(rigidbody옆에 아무것도 안 써있는 거 골라야함!! 암것도 안써있지만 사실 3d임요)

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float speed = 5;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 dir = Vector3.down;

        transform.position += dir * speed * Time.deltaTime;
    }

    //올 이거 oncoll치고 Enter치면 아래 함수부분이랑 비슷하게 나옴 (좀 고쳐야 하긴 함!!!!)
    void OnCollisionEnter(Collision other)
    {

        Destroy(other.gameObject);
        Destroy(gameObject);
    }
}

 


 

적 자동 생성 방법

 

✔︎ 적 오브젝트 PreFab으로 만들어주고 Hierarchy에서 지워줌


✔︎ Reset

 

 

 


 

EnemyManager.cs (아래 작성한 코드 아직 전부는 아님, 이후 더 작성할 코드 있음) 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScriptManager : MonoBehaviour
{

    float currentTime; // currentTime : 현재 시간 (경과 시간 )

    // 경과한 시간마다 적을 복제 
    public float createTime = 1; // createTime : 생성해주는 시간 간격 , 주기 

    public GameObject enemyFactory;

    void Start()
    {
        ......
    }

    void Update() // current time이 경과되도록 (누적 )
    {
        currentTime += Time.deltaTime; // 한 프레임을 처리하는 시간 더해주기

        if (currentTime > createTime) // 만일 현재시간이 크리에이트 타임보다 커진다면 (1초를 초과했다면
        {
            GameObject enemy = Instantiate(enemyFactory); // instantiate : 생성
                                                          // instantiate에다가 PreFab 원본을 넣어주면 됨 
                                                          // 그래서 이것을 반환값인 GameObject에다가 지역변수 (enemy)로 받는 것임
                                                          // 이렇게 받는 이유는 포지션을 넣기 위함

            enemy.transform.position = transform.position; // position에 enemymanager의 위치를 넣어주는 것임 
            // enemy.transform.position = GameObject.transform.position;
            // GameObject 안쓰면 (아니야 이거 아닐수도 있음 그냥 생략 가능일수도 이씀 )
            // 오른쪽 transform이 현재 이 오브젝트가 가지고 있는 transform 이라는 의미가 됨

               // enemy manager라는 오브젝트의 현재 position값이
               // 새로 생성되는 enemy(적 오브젝트)의 초기위치로 지정되는 것임


            // 여기까지하면 enemy가 생성되긴 함
             // 근데 1초간격이 아님 (Hierarchy창엔 보였다가 없어졌다가 계속 반복 , Scene 창에는 안보임 )
            // 그 이유는 currentTime이 계속 누적되어서 항상 1보다 크기 때문에 enemy는 '같은자리에서' 계속 생성되지만
             // Enemy.cs코드에서 충돌처리 함수 때문에 Destroy 또한 반복됨

            // 따라서 아래의 코드 한줄 작성해줘야함 !

            currentTime = 0; // (currentTime(현재시간)을 0으로 초기화 해주기)
                             // 이 코드를 인해 적이 한번 생성되면 현재 시간을 0으로 바꿔줌
                             // 이렇게 해야 누적시간이 0~1사이에서만 ㄱㄴ함
            // 여기까지하면 enemy가 1초 간격으로 잘 생성된다 !










        }

        //적 생성코드 


    }
}

 


 

✔︎ 다시 speed 5로 바꾼 후 실행.. (안 그럼 너무 느림)

 

 


 

적 5마리가 동시에 나오도록 

 

✔︎ enemyManager 오브젝트를 crtl+D로 4번 복제 

 

 

✔︎ 위치 2픽셀,..? 간격으로 

 

'프로그래밍 > Unity(C#)' 카테고리의 다른 글

#5 폴리싱 & 이펙트 & 배경 & 사운드  (0) 2023.07.08
슈팅게임 #4 충돌처리  (0) 2023.07.07
슈팅게임 - #1 플레이어 이동  (0) 2023.07.04
Vector Class 벡터 클래스  (0) 2023.07.03
Class 클래스⭐️  (0) 2023.07.03