코드네임 :
슈팅게임 - #2 총알이동, 적 이동 본문
총알이동 스크립트
총알 오브젝트 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 |