이전 코드까지 잘 붙여 넣으면
가장 가까운 적을 타겟으로 하고
가장 가까운 적 방향으로 발사하는 총알을 구현할 수 있다.
근데 문제점이
적을 죽이면 바로 에러가 나온다는 점이다.
에러가 나오는 이유는 간단하다.
적이 죽어도 플레이어의 타겟이 갱신되지 않기 때문인데,
위와 같이 질문해 주면 수정된 코드를 알려준다.
public PlayerMovement playerMovement;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
playerMovement = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerMovement>();
}
// ...
void OnDestroy()
{
playerMovement.RemoveEnemy(transform);
}
생략해서 알려주긴 하는데 알려주긴 한다.
위의 움짤은 방금까지 완성된 내용 + a이다.
a 는 간단한건데,
카메라가 플레이어를 따라가도록 하는 거다.
이제 여기까지 되면
1. 프로젝트 설정: // 완료
Unity를 열고 새 2D 프로젝트를 만듭니다.
새 장면을 만들고 여기에 카메라를 추가합니다.
카메라 위치를 (0, 0, -10)으로 설정하여 장면의 중앙에 오도록 합니다.
2. 플레이어 만들기: // 완료
플레이어용 스프라이트를 추가하고 여기에 Rigidbody2D 구성 요소를 추가합니다.
중력 스케일을 0으로 설정하고 스크립트를 추가하여 플레이어의 움직임을 제어합니다.
화살표 키 또는 WASD 키를 사용하여 플레이어를 왼쪽, 오른쪽, 위, 아래로 이동할 수 있습니다.
3. 적 추가: // 완료
적의 스프라이트를 만들고 여기에 Rigidbody2D 구성 요소를 추가합니다.
중력 스케일을 0으로 설정하고 스크립트를 추가하여 적의 움직임을 제어합니다.
무작위 이동을 사용하거나 적이 따라갈 경로를 설정할 수 있습니다.
스폰 스크립트를 사용하여 일정한 간격으로 적을 인스턴스화합니다.
4. 사격 추가: // 완료
플레이어의 총알에 대한 스프라이트를 만들고 총알의 움직임을 제어하는 스크립트를 추가합니다.
플레이어가 스페이스바 키를 누르면 총알을 인스턴스화합니다.
총알과 적의 충돌을 확인하고 충돌하면 적을 파괴하는 스크립트를 추가하십시오.
---------------------------------- 완료 -----------------------------------------------------
5. 점수 추가:
게임에 점수 카운터를 추가하고 플레이어가 적을 파괴하면 증가합니다.
텍스트 구성 요소를 사용하여 화면에 점수를 표시합니다.
6. 파워업 추가:
파워업 스프라이트를 만들고 스크립트를 추가하여 동작을 제어합니다.
생성 스크립트를 사용하여 임의의 간격으로 파워업을 인스턴스화합니다.
플레이어가 파워업을 수집하면 추가 포인트, 추가 생명 또는 강화된 무기를 제공할 수 있습니다.
7. 오디오 추가:
게임에 음향 효과와 배경 음악을 추가하여 플레이어의 경험을 향상시킵니다
4번까지 완료가 되었다.
이제 5번을 할 차례다.
여기서 사실 가져올 것은 없다.
내가 생각한 방법은
PlayManager를 만들고
PlayManager가 점수 저장 및 게임 진행 시간을 기록
게임 오버 시 게임을 다시 시작할 수 있는 기능을 부여
하는 것이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PlayManager : MonoBehaviour
{
private int score = 0;
private float timeElapsed = 0f;
private bool gameRunning = false;
public void IncrementScore(int amount)
{
score += amount;
}
public int GetScore()
{
return score;
}
public float GetTimeElapsed()
{
return timeElapsed;
}
public void StartGame()
{
score = 0;
timeElapsed = 0f;
gameRunning = true;
}
public void EndGame()
{
gameRunning = false;
}
public void RestartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
void Update()
{
if (gameRunning)
{
timeElapsed += Time.deltaTime;
}
}
}
이런 코드를 준다.
게임 오버가 되었는지를 판단하는 bool값인
gameRunning도 만들어 주었다.
위 코드 상에서 점수를 올리는 부분은
public void IncrementScore(int amount)
{
score += amount;
}
여기다.
적이 죽었을 때 이 함수를 적당히 호출해주면 된다.
일단 점수는 적당 10점으로 해놨다.
파괴되는 함수만 달랑 보냈다.
이제 UI를 담당하는 오브젝트를 만들려고 한다.
( 전공자 아님 )
ChatGPT가 보내준 코드다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
public Text scoreText;
public Text playTimeText;
private void Start()
{
// Set initial text values
SetScoreText(0);
SetPlayTimeText(0f);
}
public void SetScoreText(int score)
{
scoreText.text = "Score: " + score;
}
public void SetPlayTimeText(float time)
{
playTimeText.text = "Play Time: " + time.ToString("F2") + " seconds";
}
}
위 코드 중
public void SetScoreText(int score) // 점수 갱신
{
scoreText.text = "Score: " + score;
}
public void SetPlayTimeText(float time) // 플레이 타임 갱신
{
playTimeText.text = "Play Time: " + time.ToString("F2") + " seconds";
}
두 함수를 PlayManager와 연결 시켜준다.
이전에도 마찬가지지만
스크립트를 연결 시키고 싶을 경우
원하는 기능과 전달하고자 하는 것을 명확히 알려줘야 한다.
아래는 위 질문과 플레이 시간 관련 질문도 추가한 스크립트다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PlayManager : MonoBehaviour
{
private int score = 0;
private float timeElapsed = 0f;
private bool gameRunning = false;
private UIManager uiManager;
private void Start()
{
uiManager = FindObjectOfType<UIManager>();
}
public void IncrementScore(int amount)
{
score += amount;
uiManager.SetScoreText(score);
}
public int GetScore()
{
return score;
}
public float GetTimeElapsed()
{
return timeElapsed;
}
public void StartGame()
{
score = 0;
timeElapsed = 0f;
gameRunning = true;
}
public void EndGame()
{
gameRunning = false;
}
public void RestartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
private void Update()
{
if (gameRunning)
{
timeElapsed += Time.deltaTime;
uiManager.SetPlayTimeText(timeElapsed);
}
}
}
역시 위 코드도 제대로 동작하지 않는다.
이유는 gameRunning의 초기값이 false이기 때문이다.
바꿔달라고 요청한 뒤 다시 적용한다.
여기까지 완료 하면 아래와 같은 결과물이 나온다.
Unity 2021 이후부터는 Text가 레거시로 빠져있다.
위 스크립트의 경우 Text를 사용하기 때문에
UI로 배치할 녀석은 TMP가 아니라 Legacy로 빠져있는 Text로 추가하자.
'AI > AI활용' 카테고리의 다른 글
[NFT] AI 그림으로 NFT 작가 되기 (0) | 2023.05.18 |
---|---|
[ChatGPT][Unity] 간단한 게임 만들어보기 (4) (0) | 2023.04.09 |
[ChatGPT][Unity] 간단한 게임 만들어보기 (2) (0) | 2023.04.05 |
[ChatGPT][Unity] 간단한 게임 만들어보기 (1) (0) | 2023.04.04 |
[뤼튼],[stable diffusion] ai가 ai로 그림 그리기 (사람은 거들 뿐) (0) | 2023.03.26 |
댓글