728x90
- 해야할 것
- 키보드 하드코딩 된 부분 고치기
- 오브젝트 움직임 처리 수정
- 움직임 처리의 조건
- 방향 벡터
- 속도
- Vector3 : x, y, z (3개를 담은 데이터 컨테이너)
- position, rotation, scale
- 속력 또한 여기에서 하자
- 4가지 원소는 : w포함! vector4
void Update()
{
// 수평축과 수직축의 입력값을 감지해서 저장
float xInput = Input.GetAxis("Horizontal");
// Horizontal = Input Manager에 따른 키값
// 키보드 'a', '←' - 음의 방향 : -1.0f
// 'd', '→' - 양의 방향 : +1.0f
float zInput = Input.GetAxis("Vertical");
// 키보드 'w', '↑' - 양의 방향 : +1.0f
// 's', '↓' - 음의 방향 : -1.0f
// 실제 이동 속도를 입력값과 이동 속력을 사용해 결정
float xSpeed = xInput * speed;
float zSpeed = zInput * speed;
// Vector3 속도를 (xSpeed, 0f, zSpeed)로 생성
Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
// 이전에는 리지디바디의 물리적인 힘이었다면,
// 이젠 리디지바디의 속도! 여기에 newVelocity 할당
playerRigidbody.velocity = newVelocity; // 누적이 아님! 일관적인 속도로 나아감
}
이제 총알 슝슝
Sphere 생성! 얘가 총알임
크기랑 색상도 바꿔주었따
use gravity를 해제해준당
- Collider
- 물리적인 외관의 벽
- 충돌 감지 - 근데 충돌한지는 머름. 충돌 알려주는 건 리지드바디
브로드캐스팅 방식 : 수신송출 같은,,,
prefab
prefab화 한거임!
여러개 가져다놓을수있다
하나바꾸면 일괄적으로 바뀜
project에서 더블클릭하면 prefab editor에서 수정 가능!
근데 꼭 에디터에서 안바꾸고 bullet 중에서 하나 선택해서 바꾸고
overrides - apply all 하면 다 바뀜!
Bullet.cs 생성
void Start()
{
// 게임 오브젝트에서 Rigidbody 컴포넌트를
// 찾아 bulletRigidbody에 할당
bulletRigidbody = GetComponent<Rigidbody>();
// 리지드바디의 속도 = 앞쪽 방향 * 이동 속력;
bulletRigidbody.velocity = transform.forward * speed;
}
- transform 이거는 내 자신의 transform을 뜻함
- transform.forward 이거는 0, 0, 1임
- transform.right/up/forward 이렇게 있음. 반대되는 방향은 *-1 해주면 됨
- transform.forward * -1
- 유니티에서 사용하는 좌표 두개
- 전역 좌표(global)
- 게임 세상 속의 좌표
- 현실로 예를 들면 위도, 경도라고 생각하면 됨! 전세계에서 사용
- 지역 좌표(local)
- 내 기준~~ 게임 오브젝트가 가지는 좌표
- transform.forward는 지역좌표임
- 전역 좌표(global)
유니티로 돌아와서, bullet 스크립트 bullet prefab에 넣기!
히히 앞으로 간당
근데 계속 쭉 앞으로 간다!
파괴해줘야함!
Destroy(gameObject, 3f);
지연 시간. 3초 뒤에 파괴된다!
플레이해보면 슝 가다가 3초뒤에 hierarchy뷰에서 사라진다 헤헤
bullet - Apply All 해주기
- 유니티에서 쓰이는 충돌 처리는 크게 두가지로 나뉨
- OnCollision : Collision 방식(collider보다 좀더많은정보)으로 받아옴
- OnTrigger : Collider 방식으로 받아옴
- 각각 Enter, Stay, Exit 갖고 있음
지난번에 Player에 태그를 달아두었다
// 트리거 충돌 시 자동으로 실행되는 메서드
private void OnTriggerEnter(Collider other)
{
// 충돌한 상대방 게임 오브젝트가 Player 태그를 가졌나요?
if (other.tag == "Player")
{
// 상대방(충돌한) 게임 오브젝트에서 PlayerController 컴포넌트 가져오기
PlayerController playerController = other.GetComponent<PlayerController>();
// 상대방으로부터 PlayerController 컴포넌트를 가져오는데 성공했다면
if (playerController != null)
{
// playerController 컴포넌트의 Die() 메서드 실행
playerController.Die();
}
}
}
헤헤
이제 hierarchy에서 bullet을 삭제해주자~
총알 쏘는 거를 만들거임!!
새로운 3d object - Cylinder 생성
BulletSpawner.cs 생성
// 생성할 탄알의 원본 프리팹
public GameObject bulletPrefab;
// 발사할 대상
private Transform target;
void Start()
{
// PlayerController 컴포넌트를 가진 게임 오브젝트를 찾아서
// 그 오브젝트의 위치값을 가져와
target = FindObjectOfType<PlayerController>().transform;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletSpawner : MonoBehaviour
{
// 생성할 탄알의 원본 프리팹
public GameObject bulletPrefab;
// 최소 생성 주기
public float spawnRateMin = 0.5f;
// 최대 생성 주기
public float spawnRateMax = 3f;
// 실제 생성 주기
private float spawnRate;
// 최근 생성 시점에서 지난 시간
private float timeAfterSpawn;
// 발사할 대상
private Transform target;
void Start()
{
// 최근 생성 이후의 누적 시간을 0으로 초기화
timeAfterSpawn = 0f;
// 탄알 생성 간격을 spawnRateMin과 spawnRateMax 사이에서 랜덤 값 지정
spawnRate = Random.Range(spawnRateMin, spawnRateMax);
// PlayerController 컴포넌트를 가진 게임 오브젝트를 찾아서
// 그 오브젝트의 위치값을 가져와
target = FindObjectOfType<PlayerController>().transform;
}
void Update()
{
Instantiate(bulletPrefab);
}
}
시간 계산은 다음에~~
'Hello, World! > Unity' 카테고리의 다른 글
유니티 닷지 게임 만들어보자(6) + Visual Studio 2019 한글 깨짐 해결 (0) | 2022.03.02 |
---|---|
유니티 닷지 게임 만들어보자(5) (0) | 2022.02.28 |
유니티 닷지 게임 만들어보자(3) (0) | 2022.02.24 |
유니티 Asset / 닷지 게임 만들어보자(2) (0) | 2022.02.23 |
유니티 3d 닷지 게임 만들어보자(1) (0) | 2022.02.22 |
댓글