적이 플레이어의 총알에 닿아서 격추될 때마다 점수를 1점씩 획득하도록 한다.
플레이어의 현재 점수가 10의 배수가 될 때마다 배경 스크롤 속도를 20%씩 증가시킨다.
먼저 Background에서 스크롤 속도를 증가시키는 함수 ScrollSpeedUp 을 생성한다.
public void ScrollSpeedUp(float increaseRate)
{
// 백분율로 입력받은 매개변수의 값을 실제 적용값으로 환산한다.
float rate = increaseRate * 0.01f;
// 기본 스크롤 속도에 반영
finalSpeed += speed * rate;
}
BackGround 전문
더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// y방향으로 스크롤 하고싶다
public class Background : MonoBehaviour
{
public float speed = 0.1f;
// MeshRederer > Material > OffsetY
public float finalSpeed = 0;
Material mat;
// Start is called before the first frame update
void Start()
{
// 태어날때 MeshRenderer를 가져와서
MeshRenderer renderer = GetComponent<MeshRenderer>();
// 그안에 있는 Material을 기억하고싶다.
mat = renderer.material;
finalSpeed = speed;
}
// Update is called once per frame
void Update()
{
// 살아가면서 Material의 OffsetY값을 증가시키고 싶다.
// mat.mainTextureOffset += Vector2.up * speed * Time.deltaTime;
mat.mainTextureOffset += Vector2.up * finalSpeed * Time.deltaTime;
}
public void ScrollSpeedUp(float increaseRate)
{
// 백분율로 입력받은 매개변수의 값을 실제 적용값으로 환산한다.
float rate = increaseRate * 0.01f;
// 기본 스크롤 속도에 반영
finalSpeed += speed * rate;
}
}
PlayerMove에서 score 변수를 선언하고
10의 배수가 될 때마다 Background의 ScrollSpeedUp을 호출한다.
// score 값이 10의 배수가 될 때마다 bg에 있는 ScrollSpeedUp 함수 호출
if (score % 10 == 0 && score > checkPoint)
{
bg.ScrollSpeedUp(20.0f);
checkPoint = score;
}
점수 누적을 위해 PlayerMove에서 AddScore 함수를 생성한다.
// 점수 획득을 위한 함수
public void AddScore(int point)
{
// 매개변수 point를 통해서 받은 값을 score 변수에 누적시킨다.
score += point;
}
PlayerMove 전문
더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float speed = 5;
public float finalSpeed = 0;
// 현재 점수
public int score = 0;
// Background 클래스 호출
public Background bg;
int checkPoint = 0;
// Start is called before the first frame update
void Start()
{
finalSpeed = speed;
}
// Update is called once per frame
void Update()
{
// 사용자의 입력에 따라
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
// 방향을 만들고
Vector3 dir = Vector3.right * h + Vector3.up * v;
// right : [0,0,0] [1,0,0] [-1,0,0]
// up : [0,0,0] [0,1,0] [0,-1,0]
// 대각선 이동시 움직임의 크기가 더 크다
// 벡터를 정규화 하고싶다.
dir.Normalize();
// 만일, 키보드의 왼쪽 Shift 키를 눌렀다면
if(Input.GetKeyDown(KeyCode.LeftShift))
{
// speed 변수의 값을 2배로 늘린다.
finalSpeed = speed * 2;
}
// 그렇지 않고 만일, 키보드의 왼쪽 Shift 키를 뗏다면
else if(Input.GetKeyUp(KeyCode.LeftShift))
{
// speed 변수의 값을 원래대로 돌려 놓는다.
finalSpeed = speed;
}
// 플레이어를 이동하고싶다.
// 이동공식 P = P0 + vt
transform.position += dir * finalSpeed * Time.deltaTime;
// score 값이 10의 배수가 될 때마다 bg에 있는 ScrollSpeedUp 함수 호출
if (score % 10 == 0 && score > checkPoint)
{
bg.ScrollSpeedUp(20.0f);
checkPoint = score;
}
}
// 점수 획득을 위한 함수
public void AddScore(int point)
{
// 매개변수 point를 통해서 받은 값을 score 변수에 누적시킨다.
score += point;
}
}
Enemy에서 Bullet과 충돌시
Player 오브젝트의 PlayerMove 클래스의 AddScore 함수 호출한다.
// 만일, 충돌한 대상이 총알이라면
if(other.gameObject.name.Contains("Bullet"))
{
// 플레이어(target) 오브젝트의 PlayerMove 클래스의 AddScore 함수 호출
PlayerMove player = target.GetComponent<PlayerMove>();
player.AddScore(1);
}
Enemy 전문
더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 태어날 때 30% 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
// 살아가면서 그 방향으로 계속 이동하고싶다.
public class Enemy : MonoBehaviour
{
// 방향
Vector3 dir;
// 속력
public float speed = 5;
public GameObject explosionFactory;
GameObject target;
// Start is called before the first frame update
void Start()
{
// 태어날 때
// 플레이어를 찾는다.
target = GameObject.Find("Player");
// 30 % 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
int result = UnityEngine.Random.Range(0, 10);
if (result < 3)
{
// dir = target - me
dir = target.transform.position - transform.position;
dir.Normalize();
}
else
{
// 아래방향
dir = Vector3.down;
}
}
// Update is called once per frame
void Update()
{
// 살아가면서 그 방향으로 계속 이동하고싶다.
transform.position += dir * speed * Time.deltaTime;
}
private void OnCollisionEnter(Collision other)
{
// 시각효과 공장에서 시각효과를 만들어서
GameObject explosion = Instantiate(explosionFactory);
// 내 위치에 가져다 놓고싶다.
explosion.transform.position = transform.position;
// 만일, 충돌한 대상이 총알이라면
if(other.gameObject.name.Contains("Bullet"))
{
// 플레이어(target) 오브젝트의 PlayerMove 클래스의 AddScore 함수 호출
PlayerMove player = target.GetComponent<PlayerMove>();
player.AddScore(1);
}
// 충돌시 플레이어, 총알 파괴
Destroy(other.gameObject);
// 충돌시 에너미 파괴
Destroy(gameObject);
}
}
'공부 > Unity 기초' 카테고리의 다른 글
3D FPS - 2 / 시점 변화 (0) | 2022.05.17 |
---|---|
3D FPS - 1 / 이동과 회전, 점프 (0) | 2022.05.17 |
2D 슈팅 - 8 / 함정 추가 (0) | 2022.05.16 |
2D 슈팅 - 7 / 총알 추가 (0) | 2022.05.16 |
2D 슈팅 - 6 / 이동속도 증감 (0) | 2022.05.16 |