본문 바로가기
Hello, World!/Unity

유니티 닷지 게임 만들어보자(4)

by 27일 낮 2022. 2. 25.
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는 지역좌표임

 


유니티로 돌아와서, 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);
    }
}

시간 계산은 다음에~~

댓글