기능
더블 점프 기능, 장애물 설치- 확인하기 편하게 장애물 충돌시 무적처리(1초후 다시 물리효과O)
콘솔창 보면 충돌한거 알 수 있음. 물리기능 안끄면 밀려나서.........
장애물은 CSV파일에서 좌표값 설정 후 연결
이렇게 맵 라운드와 장애물 등장 시간, 등장 위치를 설정해주면 된다잉
코드에서는 로그를 찍어서 보이게 해놨는데 그건 주석처리 했다.
코드
PlayerController.cs (플레이어)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
public Rigidbody2D rb;
public float jumpHeight = 7f;
public float doubleJumpHeight = 9f;
int jumpCount;
bool grounded = false;
bool invincible = false; // 충돌 무적 상태 여부
void Start()
{
if (!rb)
{
rb = GetComponent<Rigidbody2D>();
}
// Jump 버튼 클릭 이벤트
Button jumpButton = GameObject.Find("Jump").GetComponent<Button>();
jumpButton.onClick.AddListener(Jump);
}
// Jump 관련 함수. 1단, 2단 설정
void Jump()
{
if (grounded || jumpCount < 2)
{
rb.velocity = Vector3.zero;
if (grounded)
{
rb.AddForce(Vector2.up * jumpHeight, ForceMode2D.Impulse);
jumpCount = 1;
}
else
{
rb.AddForce(Vector2.up * doubleJumpHeight, ForceMode2D.Impulse);
jumpCount = 2;
}
}
}
// 충돌 이벤트
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Obstacle"))
{
Debug.Log("충돌!");
if (!invincible)
{
StartCoroutine(InvincibleTime());
}
}
else if (collision.gameObject.CompareTag("Ground"))
{
grounded = true;
jumpCount = 0;
}
}
IEnumerator InvincibleTime()
{
invincible = true;
rb.isKinematic = true; // 물리 비활성화
yield return new WaitForSeconds(1f); // 1초간 대기
rb.isKinematic = false; // 물리 활성화
invincible = false;
}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
grounded = false;
}
}
}
ObstacleController.cs (장애물)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class ObstacleController : MonoBehaviour
{
// 맵 정보를 저장할 클래스
private class MapInfo
{
public float mapNum;
public float time;
public Vector3 position;
public bool spawned;
}
public GameObject obstaclePrefab;
public float speed = 2f; // 장애물 속도
private List<MapInfo> mapInfos = new List<MapInfo>();
private int currentIndex = 0;
private float gameStartTime;
void Start()
{
gameStartTime = Time.time;
ReadCSV();
}
// CSV파일 읽는 함수
void ReadCSV()
{
string filePath = "Assets/Datas/obstacle_data.csv";
string[] lines = File.ReadAllLines(filePath);
for (int i = 1; i < lines.Length; i++)
{
string line = lines[i];
string[] values = line.Split(',');
float mapNum;
float time;
float xPosition;
float yPosition;
if (values.Length >= 4 &&
float.TryParse(values[0].Trim(), out mapNum) &&
float.TryParse(values[1].Trim(), out time) &&
float.TryParse(values[2].Trim(), out xPosition) &&
float.TryParse(values[3].Trim(), out yPosition))
{
float relativeTime = float.Parse(values[1].Trim()) - gameStartTime;
mapInfos.Add(new MapInfo { mapNum = mapNum, time = relativeTime, position = new Vector3(xPosition, yPosition, 0), spawned = false });
//Debug.Log($"mapNum:{mapNum}, time:{relativeTime}, x:{xPosition}, y:{yPosition}");
}
}
StartCoroutine(SpawnObstacles());
}
// 장애물 생성 함수
IEnumerator SpawnObstacles()
{
// 모든 맵 정보를 처리할 때까지 반복
while (currentIndex < mapInfos.Count)
{
// 현재 시간보다 이전에 생성된 장애물은 생성X
if (mapInfos[currentIndex].time <= Time.time)
{
// 프리팹 로드
GameObject prefab = Resources.Load<GameObject>("obstacle1");
if (prefab == null)
{
// Debug.LogError("프리팹 오류");
yield break;
}
// 장애물을 생성
GameObject obstacle = Instantiate(prefab, mapInfos[currentIndex].position, Quaternion.identity);
// 장애물을 왼쪽으로 이동
obstacle.AddComponent<ObstacleMovement>();
obstacle.GetComponent<ObstacleMovement>().speed = speed;
mapInfos[currentIndex].spawned = true;
currentIndex++;
}
yield return null;
}
}
}
// 장애물 이동 스크립트
public class ObstacleMovement : MonoBehaviour
{
public float speed = 1f;
void Update()
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
if (transform.position.x < -10f)
{
Destroy(gameObject);
}
}
}
어려웠거나 알게된 점
csv파일 연결하기............. 그냥 코드로 길게 작성하거나 일정하게 장애물이 등장 하는것보단 직접 패턴을 만드는게 더 게임으로서 실감이 날 것 같아서 해봤다.
어려웠던 점은 자꾸... 형변환이 이상하다고? 뭐 그래서 오류가 났던 것 같다. 그것때문에 시간이 좀~ 걸렸다
그래도 해결하고 나니 행복하군
계획
[ 개발 일정 계획표 ]
2024-04-09
- 플레이어 점프 기능, 그라운드 스크롤, 배경 스크롤
2024-04-10
- 더블 점프 기능, 장애물 설치(랜덤 장애물로 할지 고정 시간에 장애물을 보이게 할지 미정), 장애물 충돌 이벤트 설정
2024-04-11
- 로딩화면(스플래시) 제작 및 설정, 전체적인 씬 UI 구현
2024-04-12
- 기본 좀비맛 스프라이트 이용하여 애니메이션 설정, 쿠키 슬라이드 기능
2024-04-13
- 달리기 기능, 점수 기능
2024-04-14
- 화폐 관리, 뽑기 기능
2024-04-15
- 내 쿠키 확인 기능
> 이전글
https://milkyquartz.tistory.com/199
'Unity > Project' 카테고리의 다른 글
[Unity] step4. 좀비런: 좀비맛 스프라이트 이용하여 애니메이션 설정, 쿠키 슬라이드 기능(Feat. 내배캠 - TIL) (0) | 2024.04.12 |
---|---|
[Unity] step3. 좀비런: UI와 로딩화면 제작 (2) | 2024.04.11 |
[Unity] step1. 좀비런: 플레이어 점프 기능, 바닥 스크롤, 배경 스크롤 (Feat. 내배캠 - TIL) (0) | 2024.04.09 |
[Unity] step0. 쿠키런: 오븐브레이크 2차창작물 제작 기획안 (2) | 2024.04.09 |
[Unity] AIR(AI와 AR을 이용한 교육 보조 프로그램) - 종합설계 프로젝트 (4) | 2024.01.26 |