유니티 에셋을 들어가서 Realistic Terrain Collection Lite 무료 에셋을 다운로드합니다
window -> Package Manager 를 열고 임포트 합니다
임포트 한 파일에서 Terrain 5 파일 안에 자기가 맘에 드는 Terrain 파일 하나를 골라 Hierarchy 안으로 끄집어 올려놓습니다
에셋 스토어에 다시 들어가서 Star Sparrow Modular Spaceship 에셋을 다운 받습니다
Package Manager 에서 임포트 하여 다운로드합니다
다운로드한 Star Sparrow 파일에서 Prefabs 폴더의 Examples에서 맘에 드는 비행기를 하나 골라서 Hierarchy 위에 끄집어 올려놓습니다
올려놓은 비행기의 이름을 PlayerShip 으로 바꾸고 Assets폴더에 Prefabs 폴더를 하나 만들어서 드래그하여 프리팹으로 만듭니다
오른쪽 마우스 버튼을 눌러서 Create Empty 오브젝트를 만든 다음 이름을 PlayerRig 로 바꾸고 Transform 값을 아래 그림과 같이 놓습니다 그리고 자식으로 PlayerRig와 Transform 값을 같은 값으로 하고 아래 그림과 같이 자식으로 놓습니다
그리고 PlayerRig 자식으로 Main Camera 를 두고 Transform 값을 아래 그림과 같이 하여 카메라 보는 각도가 비행기 뒤쪽에서 바라보게 끔 합니다
Create Empty 를 만들고 이름을 Master Timeline으로 합니다
Master Timeline 선택하고 Window -> Sequencing -> Timeline 을 클릭하여 Timeline 창을 보이게 합니다
Master Timeline 오브젝트를 선택하고 Timeline 창에 Create 버튼을 클릭하고 타임라인저장할 Assets 폴더에 새로운 폴더를 만듭니다
Master Timeline 오브젝트를 선택하고 Timeline 창에서 +버튼을 누르고 Animation Track 를 선택합니다
Timeline 창에서 오른쪽의 자물쇠 모야을 잠금으로 합니다
PlayerRig 오브젝트를 드래그 하여 Timeline 창의 Animation Track에 드래그합니다
Timeline 창에서 아래와 같이 빨간 버튼을 누릅니다
PlayerRig를 움직이면 Timeline 시간대에 점이 찍힘니다 PlayerRig를 자기가 움직이고 싶은 위치와 Timeline 시간대에 갔다 놓으면 됩니다
Timeline의 아래와 같이 선 모양의 아이콘을 클릭하면 Animated Values 가 나오는데 찍혀있는 점들을 움직이면 위치와 회전을 바꿀 수 있습니다
아래와 같이 PlayerRig 움직여 Timeline 시간대에 점이 찍히는 방향대로 움직인 결과 입니다
Assets에 Scripts 폴더를 만들고 새로운 스크립트를 생성하여 이름을 PlayerControl을 만듭니다
스크립트를 작성합니다
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using UnityEngine.InputSystem;
//using UnityEngine.Rendering.HighDefinition;
public class PlayerControl : MonoBehaviour
{
public float controlSpeed = 10f;
public float xRange = 12f;
public float yRange = 10f;
public float positionPithcFactor = -2f;
public float controlPithcfactor = -10f;
public float positionYawFactor = 2f;
public float controlRollFactor = -20f;
float xThrow;
float yThrow;
void Update()
{
ProcessTranslation();
ProcessRotation();
}
//상하좌우로 움직일때 로컬 로테이션을 준다
void ProcessRotation()
{
//y축 로컬 움직임 팩터
float pitchDueToPosition = transform.localPosition.y * positionPithcFactor;
float pitchdueToControlThrow = yThrow * controlPithcfactor;
float pitch = pitchDueToPosition + pitchdueToControlThrow;
//x축 로컬 움직임 팩터
float yaw = transform.localPosition.x * positionYawFactor;
float roll = xThrow * controlRollFactor;
//로컬축으로 로테이션한다
transform.localRotation = Quaternion.Euler(pitch, yaw, roll);
}
private void ProcessTranslation()
{
//좌우 입력
xThrow = Input.GetAxis("Horizontal");
//상하 입력
yThrow = Input.GetAxis("Vertical");
//시간에 따라 좌우 움직임을 준다
float xoffset = xThrow * Time.deltaTime * controlSpeed;
float rawXPos = transform.localPosition.x + xoffset;
//플레이어 좌우 이동 제한
float clampedXPos = Mathf.Clamp(rawXPos, -xRange, xRange);
//시간에 따라 상하 움직임을 준다
float yoffset = yThrow * Time.deltaTime * controlSpeed;
float rawYpos = transform.localPosition.y + yoffset;
//플레이어 상하 이동 제한
float clampedYPos = Mathf.Clamp(rawYpos, -yRange, yRange);
//키를 누르면 오브젝트를 상하좌우로 움직이게 한다
transform.localPosition = new Vector3(clampedXPos, clampedYPos, transform.localPosition.z);
}
}
PlayerShip 오브젝트를 선택하고 PlayerControl 스크립트를 드래그 하여 붙입니다
그리고 아래그림과 같이 데이터 값을 넣습니다
게임을 실행시켜서 AD(좌우) WS(상하) 키를 움직여서 비행기가 화면을 벋어나지 않고 잘 움직이는지 확인합니다
먼저 Hierarchy 뷰에서 마우스 오른쪽 버튼을 클릭하고 UI -> Text를 생성합니다
그러면 Hierarchy 뷰에서 Canvas 가 생성됩니다
Canvas 를 선택하고 UI Scale Mode -> Scale With Screen Size , Reference Resolution 1080 1920 , Match 0.5에 맞춥니다
Canvas 자식으로 있는 Text 의 이름을 ScoreText로 바꾸고 ScoreText를 선택하여 Center를 클릭한 다음 아래 사진처럼 top 중앙에 올 수 있도록 합니다
그리고 Canvas 를 클릭하고 마우스 오른쪽을 클릭하고 Create Empty 하여 GameObject를 생성한 다음 이름을 GameUI로 고친 후 ScoreText를 자식으로 놓습니다
GameManager 스크립트를 수정합니다
점수 Text 를 넣을 수 있는 네임스페이스(using UnityEngin.UI)를 추가하고 변수에 int score = 0 , pulic Text scoreText 추가 GameStart() 함수에 gameUI.SetActive(true) StartCoroutine(UpdateScore()) 추가
IEnumerator UpdateScore() { //1초 지날때 마다 1점씩 올라간다 while (true) { yield return new WaitForSeconds(1f); score++;
scoreText.text = score.ToString(); } }
추가 합니다
반응형
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
//
public GameObject platformSpawner;
public GameObject gameUI;
public bool gameStarted;
int score = 0;
public Text scoreText;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (!gameStarted)
{
//마우스 클릭하면 차가 움직인다
if (Input.GetMouseButtonDown(0))
{
GameStart();
}
}
}
public void GameStart()
{
gameStarted = true;
//platformSpawner 스크립트를 실행
platformSpawner.SetActive(true);
gameUI.SetActive(true);
StartCoroutine(UpdateScore());
}
public void GameOver()
{
//platformSpawner 스크립트를 없앤다
platformSpawner.SetActive(false);
//1초후 게임재시작 함수에 전달
Invoke("ReloadGame",1);
}
//게임재시작
void ReloadGame()
{
SceneManager.LoadScene("Game");
}
IEnumerator UpdateScore()
{
//1초 지날때 마다 1점씩 올라간다
while (true)
{
yield return new WaitForSeconds(1f);
score++;
scoreText.text = score.ToString();
}
}
}
Hierarchy 뷰에서 Canvas 자식으로 있는 GameUI를 끄고 GameManager를 선택하여 GameUI와 ScoreText를 연결합니다
이번 시간에는 게임이 끝나면 게임을 재시작하는 스크립트를 짜고 3D 게임에서 오브젝트를 밝게 비추는 라이트를 고정해 놓는 작업을 하겠습니다
먼저 Hierarchy 뷰에서 GameManager 오브젝트를 선택하여 GameManager 스크립트를 열고 스크립트를 수정합니다
반응형
GameManager 스크립트 수정
스크립트를 열고 네임스페이스 부분에서
using UnityEngine.SceneManagement;
를 추가합니다
그리고 ReloadGame() 함수를 추가하여 GameOver() 함수에서 실행하는 명령을 추가합니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
//
public GameObject platformSpawner;
public bool gameStarted;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (!gameStarted)
{
//마우스 클릭하면 차가 움직인다
if (Input.GetMouseButtonDown(0))
{
GameStart();
}
}
}
public void GameStart()
{
gameStarted = true;
//platformSpawner 스크립트를 실행
platformSpawner.SetActive(true);
}
public void GameOver()
{
//platformSpawner 스크립트를 없앤다
platformSpawner.SetActive(false);
//1초후 게임재시작 함수에 전달
Invoke("ReloadGame",1);
}
//게임재시작
void ReloadGame()
{
SceneManager.LoadScene("Game");
}
}
먼저 Hierarchy뷰에서 car1을 선택하고 is Kinematic을 체크 해저 합니다
is Kinematic을 해제하면 자동차가 중력의 영향을 받게 됩니다
CarCtrl스크립트를 수정합니다
Update() 함수에
if (transform.position.y <= -2) { GameManager.instance.GameOver(); }
항목을 추가합니다
car1 이 중력을 받고 떨어지면 게임을 끝내는 GameOver() 함수를 실행합니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CarCtrl : MonoBehaviour
{
public float moveSpeed;
bool sideMoving = true;
bool firstInput = true;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (GameManager.instance.gameStarted)
{
Move();
CheckInput();
}
//자동차가 중력을 받고 떨어졌을때 y 값이 떨어지면 게임오버실행
if (transform.position.y <= -2)
{
GameManager.instance.GameOver();
}
}
void Move()
{
//물체의 z축 방향(forward)으로 moveSpeed 만큼 시간 프레임에 곱해준다
transform.position += transform.forward * moveSpeed * Time.deltaTime;
}
void CheckInput()
{
//첫 클릭은 무시하고 리턴한다
if (firstInput)
{
firstInput = false;
return;
}
//마우스를 왼쪽버튼 클릭하면
if (Input.GetMouseButtonDown(0))
{
ChangeDirection();
}
}
void ChangeDirection()
{
//sideMoving 참일때
if (sideMoving)
{
sideMoving = false;
//y축 방향으로 90도 회전한다
transform.rotation = Quaternion.Euler(0, 90, 0);
}
else
{
sideMoving = true;
transform.rotation = Quaternion.Euler(0, 0, 0);
}
}
}
GameManager스크립트를 수정합니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
//
public GameObject platformSpawner;
public bool gameStarted;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (!gameStarted)
{
//마우스 클릭하면 차가 움직인다
if (Input.GetMouseButtonDown(0))
{
GameStart();
}
}
}
public void GameStart()
{
gameStarted = true;
//platformSpawner 스크립트를 실행
platformSpawner.SetActive(true);
}
public void GameOver()
{
//platformSpawner 스크립트를 없앤다
platformSpawner.SetActive(false);
}
}
GameManager 스크립트를 수정하고 GameManager스크립트 PlatformSpawner 빈 공간에 PlatformSpawner 오브젝트를 연결합니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target;
Vector3 distance;
public float smoothValu;
// Start is called before the first frame update
void Start()
{
// 카메라와 타겟 자동차와의 거리
distance = target.position - transform.position;
}
// Update is called once per frame
void Update()
{
//자동차가 떨어지지 않으면 Follow()실행, 떨어지면 카메라가 움직이지 않는다
if (target.position.y >= 0)
{
Follow();
}
}
void Follow()
{
//현재 카메라 포지션
Vector3 currentPos = transform.position;
//현재 타겟 자동차
Vector3 targetPos = target.position - distance;
//currentPos(카메라)가 targetPos(자동차)을 smoothValu 만큼 time 프레임에 맞쳐 뒤따라간다
transform.position = Vector3.Lerp(currentPos, targetPos, smoothValu * Time.deltaTime);
}
}
Platform 스크립트를 생성합니다
Prefab 폴더의 PlatformP 프리 팹을 선택하고 Plaform 스크립트를 연결합니다
Platform 스크립트 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Platform : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionExit(Collision collision)
{
//Player태그를 가진 오브젝트와 닿았을때 0.2초후 Fall()실행
if (collision.gameObject.tag == "Player")
{
Invoke("Fall", 0.2f);
}
}
void Fall()
{
//중력의 영향을 받고 물체를 떨어진다 그리고 1초후 삭제
GetComponent<Rigidbody>().isKinematic = false;
Destroy(gameObject, 1f);
}
}
car1 오브젝트를 선택하고 Inspector에서 Tag -> Player를 줍니다
게임을 실행하여 도로블록이 자동차가 지나갔을 때 아래로 떨어지고 자동차가 도로에서 벗어나면 자동차가 중력을 받고 떨어지고 블록 생성이 중단되는지 확인합니다
자동차의 시점을 따라가도록 카메라의 스크립트를 달아 자동차를 따라가게 하고 자동차의 도로 역할을 하는 사각 블록을 자동으로 생성되는 스크립트를 만들어보겠습니다
Hierarchy 뷰에 Create Empty 를 만들어서 이름을 PlatformSpawner로 합니다
Scripts폴더에 PlatformSpawner 스크립트를 생성하고 스크립트작성할 준비를 합니다
PlatformSpawner 오브젝트의 PlatformSpawner 스크립트를 붙힙니다
PlatformSpawner 스크립트작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlatformSpawner : MonoBehaviour
{
public GameObject platform;
public Transform lastPlatform;
Vector3 lastPosition;
Vector3 newPos;
bool stop;
// Start is called before the first frame update
void Start()
{
lastPosition = lastPlatform.position;
StartCoroutine(SpawnPlatforms());
}
// Update is called once per frame
void Update()
{
//if (Input.GetKey(KeyCode.Space))
//{
// SpawnPlatforms();
//}
}
IEnumerator SpawnPlatforms()
{
while (!stop)
{
GeneratePosition();
//마지막플랫폼블럭위치에 newPos만큼 새로운 플랫폼블럭을 생성한다
Instantiate(platform, newPos, Quaternion.identity);
lastPosition = newPos;
yield return new WaitForSeconds(0.1f);
}
}
//void SpawnPlatforms()
//{
// GeneratePosition();
// //마지막플랫폼블럭위치에 newPos만큼 새로운 플랫폼블럭을 생성한다
// Instantiate(platform, newPos, Quaternion.identity);
// lastPosition = newPos;
//}
// 랜덤으로 lastPosition 값을 x,y 값 2만큼 움직이게 한다
void GeneratePosition()
{
newPos = lastPosition;
int rand = Random.Range(0, 2);
if (rand > 0)
{
newPos.x += 2f;
}
else
{
newPos.z += 2f;
}
}
}
Hierarchy뷰에서 PlatformSpawner 오브젝트를 선택하고 작성한 PlatformSpawner 스크립트 공백에 Platform 에는 프리 팹으로 넣은 PlatformP 프리 팹을 넣어주고, Last Platform 에는 박스 오브젝트 복사 모듈인 PlatformP (3)을 넣어줍니다
자동차의 움직임을 자연스럽게 카메라를 따라가는 스크립트를 만듭니다
Main Camera를 선택하고 CameraFollow 스크립트를 생성하여 Main Camera에 붙입니다
CameraFollow 스크립트 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target;
Vector3 distance;
public float smoothValu;
// Start is called before the first frame update
void Start()
{
// 카메라와 타겟 자동차와의 거리
distance = target.position - transform.position;
}
// Update is called once per frame
void Update()
{
Follow();
}
void Follow()
{
//현재 카메라 포지션
Vector3 currentPos = transform.position;
//현재 타겟 자동차
Vector3 targetPos = target.position - distance;
//currentPos(카메라)가 targetPos(자동차)을 smoothValu 만큼 time 프레임에 맞쳐 뒤따라간다
transform.position = Vector3.Lerp(currentPos, targetPos, smoothValu * Time.deltaTime);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CarCtrl : MonoBehaviour
{
public float moveSpeed;
bool sideMoving = true;
bool firstInput = true;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (GameManager.instance.gameStarted)
{
Move();
CheckInput();
}
}
void Move()
{
//물체의 z축 방향(forward)으로 moveSpeed 만큼 시간 프레임에 곱해준다
transform.position += transform.forward * moveSpeed * Time.deltaTime;
}
void CheckInput()
{
//첫 클릭은 무시하고 리턴한다
if (firstInput)
{
firstInput = false;
return;
}
//마우스를 왼쪽버튼 클릭하면
if (Input.GetMouseButtonDown(0))
{
ChangeDirection();
}
}
void ChangeDirection()
{
//sideMoving 참일때
if (sideMoving)
{
sideMoving = false;
//y축 방향으로 90도 회전한다
transform.rotation = Quaternion.Euler(0, 90, 0);
}
else
{
sideMoving = true;
transform.rotation = Quaternion.Euler(0, 0, 0);
}
}
}
Move Speed 8을 넣습니다
그리고 GameManager 스크립트를 만듭니다
Hierachy 뷰에서 GameManager 오브젝트를 만들고 GameManager 스크립트를 붙입니다
GameManager 스크립트 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public bool gameStarted;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (!gameStarted)
{
//마우스 클릭하면 차가 움직인다
if (Input.GetMouseButtonDown(0))
{
GameStart();
}
}
}
public void GameStart()
{
gameStarted = true;
}
public void GameOver()
{
}
}
GameObject 인 Cube의 이름을 Platform이라 하고 Inspector 메뉴에서 Scale 4,1,4로 바꿉니다
Main Camera를 선택하고 Scene뷰에서 Platform 오브젝트를 대각선 방향으로 윗면이 보이게 아래 그림처럼 방향을 설정하고 GameObjet-> Align With View를 선택하면 Scen 뷰에서 방향을 맞춘 Camera 방향이 Game 뷰에 맞추어지게 됩니다
그리고 Main Camera를 선택하고 Inspector 메뉴에서 Projection -> Orthographic
Size -> 7에 맞춥니다
hierarchy에서 Platform을 복사하여 새로운 Platform을 만들고 위치를 z 3 만큼 움직이고 Scale 2,1,2
를 맞추고 BoxCollider를 생성하고 RigidBody 생성하여 Is Kinematic 체크합니다
그리고 복사한 Platform의 이름을 PlatformP로 바꾸고 Project Assets 폴더에서 Prefab 폴더를 생성하고 PlatformP를 저장합니다
PlaformP 오브젝트를 3개 더 복사하여 Z 간격을 각각 2 만큼씩 띄웁니다
car1 FBX 파일을 다운로드하여 유니티 엔진의 Project Assets의 Models 폴더를 만들고 car1 파일을 저장합니다
다운로드한 car1 파일을 선택하고 Model -> Scale Factor 0.01을 합니다
Models 파일에 있는 car1 파일을 드래그하여 Hierarchy 뷰 에 갖다 놓고 Scale 0.5 ,0.5, 0.5에 맞춥니다
빈오브젝트를 만들고 이름을 Enemy 하고 Enemy그림파일을 각각 관절에 맞게 Hierarchy 창에 끌어다 놓고 그림을 인간형에 맞게 맞춥니다
Enemy의 각각의 관절에 Sorting Layer -> Enemy 를 만들고 그림이 위아래가 바뀌지 않도록 합니다
Enemy 오브젝트의 Window -> animation -> animation 을 열고 Create new Clip을 Enemy_Run을 만들고 적 캐릭터가 움직이는 애니메이션을 만듭니다
Enemy 스크립트를 생성하고 작성합니다
Enemy 스크립트 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
//적캐릭터의 생명카운트
public int health;
//Player 위치
[HideInInspector]
public Transform player;
//스피드
public float speed;
//공격과 재공격의 시간
public float timeBetweenAttacks;
// 데미지
public int damage;
private void Start()
{
//Player tag 오브젝트를 찾는다
player = GameObject.FindGameObjectWithTag("Player").transform;
}
//공격을 받을때 생명이 줄어드는 함수
public void TakeDamage(int damageAmount)
{
health -= damageAmount;
if (health <= 0)
{
Destroy(gameObject);
}
}
}
주위 배경을 위해서 Background 텍스쳐 파일을 하이 라키 뷰에 올리고 중앙에 맞춥니다
그리고 텍스쳐 스케일을 카메라뷰보다 넓게 4,4,1로 맞춥니다
새로운 오브젝트를 생성하고 이름을 CameraFollow 라 합니다
CameraFollow 오브젝트의 자식으로 Main Camera를 옮겨다 놓습니다
CameraFollow 스크립트를 작성합니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
//Player 포지션
public Transform playerTransform;
public float speed;
public float minX;
public float maxX;
public float minY;
public float maxY;
// Start is called before the first frame update
void Start()
{
//Player 포지션을 가지고 온다
transform.position = playerTransform.position;
}
// Update is called once per frame
void Update()
{
if (playerTransform != null)
{
//화면의 X축의 최대점과 최소점을 넘지않게 설정
float clampedX = Mathf.Clamp(playerTransform.position.x, minX, maxX);
//화면의 Y축의 최대점과 최소점을 넘지않게 설정
float clampedY = Mathf.Clamp(playerTransform.position.y, minY, maxY);
//카메라를 clampedX,clampedY 방향으로 speed 속도를 부드럽게 이동
transform.position = Vector2.Lerp(transform.position,new Vector2(clampedX,clampedY), speed);
}
}
}
Player 오브젝트를 드래그하여 Player Transform 빈 공간에 드래그하여 붙이고 speed를 0.12 정도 합니다
CameraFollow오브젝트를 X 쪽으로 -11 만큼 움직입니다 카메라가 배경 보이는 끝선에 맞춤니다
그리고 Min X 에 -11을 넣습니다
CameraFollow를 x축으로 그림영역 최댓값에 맞추고 MaxX를 11을 넣습니다
CameraFollow를 y축으로 그림영역 최솟값에 맞추고 MinY를 -7을 넣습니다
CameraFollow를 y축으로 그림영역 최댓값에 맞추고 MaxY를 5를 넣습니다
하이라키뷰에 Stoper오브젝트 4개를 생성합니다
Stoper 오브젝트에 BoxCollider2D를 붙이고 각각 위치를 배경 끝에 놓습니다
Player 오브젝트에 BoxCollider2D 를 붙입니다
게임을 실행하여 Player의 움직임에 Camera가 따라가고 배경의 보이는 부분까지만 Player가 제한되는 움직임을 보입니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletCtrl : MonoBehaviour
{
public float speed;
public float lifeTime;
// Start is called before the first frame update
void Start()
{
// 총알을 시간에 맞게 지운다
Destroy(gameObject, lifeTime);
}
// Update is called once per frame
void Update()
{
// 시간프레임과 speed에 따라 y축방향으로 움직인다
transform.Translate(Vector2.up * speed * Time.deltaTime);
}
}
아래 동영상과 같이 마우스에 따라 총이 움직이고 총알이 마우스에 따라 방향대로 발사되는 것을 확인합니다