2023. 11. 3. 18:23ㆍSKKU DT
3D 템플릿을 사용할 예정.(Depth 고려해야 할 상황이 올 수도 있음)
카메라 컴포넌트 수정 persp -> jortho
카메라 position.y는 0 으로
Directional Light 비활성화
라이팅 굽기
Envirionment Lighting Source 변경, 색상 흰색 변경
게임 해상도 새로 생성 (640x960)
플레이어와 플레이어 스크립트 생성
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float speed = 5.0f;
void Start()
{
}
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 pos = new Vector3(horizontal, vertical, 0);
//Vector3 dir = Vector3.right * horizontal + Vector3.up * vertical; 더하기도 된다.
//물체의 이동
//transform.Translate(pos * speed * Time.deltaTime); //원래 쓰던 방식
transform.position += pos * speed * Time.deltaTime; //물리적 표현. 미래 거리 = 현재 거리 + (속력*시간)
}
}
총알 생성, 총알 스크립트 생성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
//이동 속도
public float speed = 5.0f;
void Start()
{
}
void Update()
{
//방향 구하기
Vector3 dir = Vector3.up;
//이동
transform.position += dir * speed * Time.deltaTime;
}
}
PlayerFire 스크립트로 총알을 만드는 스크립트 생성
-Instantiate 함수** 중요
-총알을 프리팹으로 만들어야 함
-firePosition Empty GameObject는 Player의 children으로 이동
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
public class PlayerFire : MonoBehaviour
{
//총알 생성 풀
public GameObject bullet;
//발사 위치
public GameObject firePosition;
void Start()
{
}
void Update()
{
if (Input.GetButtonDown("Fire1")) //Input Manager에 Fire1 이름을 사용
{
//Bullet 생성
GameObject bullets = Instantiate(bullet);
bullets.transform.position = firePosition.transform.position;
}
}
}
적 생성, Enemy 스크립트 생성, 플레이어와 충돌 가능하게 만들기(Enemy에 RigidBody 추가)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed = 5f;
void Start()
{
}
void Update()
{
//방향
Vector3 dir = Vector3.down;
//이동
transform.position += dir * speed * Time.deltaTime;
}
//충돌 감지
private void OnCollisionEnter(Collision collision)
{
//적 오브젝트 제거
Destroy(gameObject);
//플레이어 오브젝트 제거 -> 위에 매개변수를 가져다 쓰면 됨. collision
Destroy(collision.gameObject);
}
}
EnemyManager 빈 오브젝트 생성 -적 스폰 위치 표시, 주변에 큐브 만들어서 닿으면 없어지게끔.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DestroyZone : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;
public class EnemyManager : MonoBehaviour
{
//현재 시간
float currentTime = 0;
//일정 시간
public float createTime;
//적 생성
public GameObject enemy;
void Start()
{
createTime = Random.Range(0.2f, 2.0f);
}
void Update()
{
currentTime += Time.deltaTime;
if (currentTime > createTime)
{
currentTime = 0;
createTime = Random.Range(0.2f, 2.0f);
//적 생성
//GameObject enemies = Instantiate(enemy);
//적 생성 위치 -> EnemyManager 오브젝트의 위치
//enemies.transform.position = transform.position;
//랜덤 위치 생성
Instantiate(enemy, new Vector3(Random.Range(-3.0f, 3.0f), 6, 0), Quaternion.identity);
}
}
}
**DestroyZone 끼리 충돌하여 실행시 사라짐
새로운 레이어 생성해서 적용한다.
Physics에서 DestroyZone 레이어들은 서로 부딪히지 않도록 설정한다.
플레이어, 에너미, 불릿도 레이어 생성해서 Physics 적용한다.
무료 에셋 모델링 적용하기
https://assetstore.unity.com/packages/3d/vehicles/air/awesome-cartoon-airplanes-56715
프리팹을 Player의 자식 오브젝트로 등록한다.
랜덤 적 색깔 적용
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;
public class EnemyManager : MonoBehaviour
{
//현재 시간
float currentTime = 0;
//일정 시간
public float createTime;
//적 생성
public GameObject[] gameObjects = new GameObject[2];
void Start()
{
createTime = Random.Range(0.2f, 2.0f);
}
void Update()
{
currentTime += Time.deltaTime;
if (currentTime > createTime)
{
currentTime = 0;
createTime = Random.Range(0.2f, 2.0f);
int type = Random.Range(0, 3);
//적 생성
//GameObject enemies = Instantiate(enemy);
//적 생성 위치 -> EnemyManager 오브젝트의 위치
//enemies.transform.position = transform.position;
//랜덤 위치 생성
Instantiate(gameObjects[type], new Vector3(Random.Range(-3.0f, 3.0f), 6, 0), Quaternion.identity);
}
}
}
랜덤 미사일 적용
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
public class PlayerFire : MonoBehaviour
{
//총알 생성 풀
public GameObject bullet;
//발사 위치
public GameObject firePosition;
public GameObject[] missiles = new GameObject[10];
void Start()
{
}
void Update()
{
int type = Random.Range(0, 7);
if (Input.GetButtonDown("Fire1")) //Input Manager에 Fire1 이름을 사용
{
//Bullet 생성
GameObject bullets = Instantiate(missiles[type]);
bullets.transform.position = firePosition.transform.position;
}
}
}
맞아서 폭발하는 효과 넣기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed = 5f;
//폭발
public GameObject explosion;
void Start()
{
}
void Update()
{
//방향
Vector3 dir = Vector3.down;
//이동
transform.position += dir * speed * Time.deltaTime;
}
//충돌 감지
private void OnCollisionEnter(Collision collision)
{
//폭발
GameObject explosions = Instantiate(explosion);
explosions.transform.position = transform.position;
//적 오브젝트 제거
Destroy(gameObject);
//폭발
GameObject explosions_p = Instantiate(explosion);
explosions_p.transform.position = collision.transform.position;
//플레이어 오브젝트 제거 -> 위에 매개변수를 가져다 쓰면 됨. collision
Destroy(collision.gameObject);
}
}
점수 표시하기 -Best Score 추가, 빈 오브젝트 ScoreManager 생성
Enemy 스크립트에 접근해서 score 점수를 가져와서 ScoreManager에서 사용. (외부 스크립트에 접근)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed = 5f;
//폭발
public GameObject explosion;
void Start()
{
}
void Update()
{
//방향
Vector3 dir = Vector3.down;
//이동
transform.position += dir * speed * Time.deltaTime;
}
//충돌 감지
private void OnCollisionEnter(Collision collision)
{
GameObject smObject = GameObject.Find("ScoreManager"); //Scne에서 ScoreManager 오브젝트를 찾아서 가져옴
ScoreManager sm = smObject.GetComponent<ScoreManager>(); //스크립트 sm 객체 생성. Getcomponent 안에는 스크립트 이름 그대로 써준다.
sm.currentscore++;
sm.currentscoreUI.text = "Current Score\n" + sm.currentscore.ToString();
if(sm.currentscore > sm.bestscore)
{
sm.bestscore = sm.currentscore;
sm.bestscoreUI.text = "Best Score\n" + sm.bestscore.ToString();
}
//적 폭발
GameObject explosions = Instantiate(explosion);
explosions.transform.position = transform.position;
//적 오브젝트 제거
Destroy(gameObject);
//플레이어 폭발
GameObject explosions_p = Instantiate(explosion);
explosions_p.transform.position = collision.transform.position;
//플레이어 오브젝트 제거 -> 위에 매개변수를 가져다 쓰면 됨. collision
Destroy(collision.gameObject);
}
}
배경 스크롤 -배경 스크립트 추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BackGround : MonoBehaviour
{
//배경 메테리얼 가져오기
public Material bgMaterial;
//스크롤 속도 조절
public float speed = 1.0f;
void Update()
{
//방향 설정
Vector2 dir = Vector2.up; //메테리얼이 Vector2이기 때문에 Vector2 사용
bgMaterial.mainTextureOffset += dir * speed * Time.deltaTime;
}
}
게임 매니저 스크립트 추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager_Shoot : MonoBehaviour
{
public GameObject uiPanel;
void Start()
{
uiPanel.SetActive(false);
}
void Update()
{
if (!GameObject.Find("Player"))
{
uiPanel.SetActive(true);
Time.timeScale = 0;
}
else
{
Time.timeScale = 1;
}
}
public void Restart()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
public void Quit()
{
Application.Quit();
}
}
완성
'SKKU DT' 카테고리의 다른 글
[SKKU DT] 7일차 - 3D 그래픽스 이론(Rasterize, 셰이더), 블렌더 포토샵으로 UV (0) | 2023.11.07 |
---|---|
[SKKU DT] 6일차 -3D 그래픽스 이론 / 블렌더 모델링 (0) | 2023.11.06 |
[SKKU DT] 4일차 -아이템 먹는 미니 게임 완성(스크립트, UI), 개발방법론 조금 (0) | 2023.11.02 |
[SKKU DT] 3일차 -유니티 기본(에셋, 메테리얼, 텍스쳐, 애니메이션), C# 기본 (0) | 2023.11.01 |
[SKKU DT] 2일차 메모 -디지털 트윈 서적, RFP (0) | 2023.10.31 |