과제를 하면서 유니티로 게임 만들기를 해보았다 !
유니티는 원하는 이미지에 C#스크립트를 연결하는 방식으로,
자신이 짠 코드대로 이미지를 동작시킬 수 있다 !
만드는 김에 내가 좋아하는 아리스쨩과 블루아카이브 청휘석 이미지를 사용해보기로함 !
나의 목표 -> 아리스가 청휘석을 먹으면 점수가 오르게 만들기
결론은 반만 성공했다.
consol창에는 점수가 오르는게 뜨는데, 화면에 어떻게 띄우는지 모르겠음 ㅠㅠ
계속 개발해봐야할 것 같다.
~ 지피티짱이랑 힘을 합쳐서 노력한 결과물 ~
게임이 실행되면 청휘석이 랜덤하게 생성되고,
아리스에 닿으면 사라진다
화면에 나타나는 청휘석을 모두 먹으면 CLEAR 가 뜸 !
별다른 특별한 기능은 없지만 !!!
만드는 방법
아리스 Inspector
아리스에 연결한 C# 스크립트
using UnityEngine;
using UnityEngine.UI;
public class aris_script : MonoBehaviour
{
[Header("이동속도 조절")]
[SerializeField][Range(1f, 30f)] float moveSpeed = 5f; // 원하는 속도로 조절
[SerializeField][Range(0f, 1f)] float stoppingForce = 0.5f; // 멈추는 힘의 강도 조절
private Rigidbody2D rb;
private int score;
private bool isClear = false; // Clear 여부를 저장하는 변수
private Camera mainCamera;
private Text clearText;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
mainCamera = Camera.main;
clearText = FindObjectOfType<Text>();
if (clearText != null)
{
// 텍스트를 맨 위로 올리기
clearText.transform.SetAsLastSibling();
}
}
void Update()
{
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
Vector2 movement = new Vector2(moveX, moveY);
// 입력이 있는 경우에만 힘을 가함
if (movement.magnitude > 0)
{
rb.AddForce(movement * moveSpeed);
}
else
{
// 입력이 없는 경우 멈추는 힘을 가해 움직임을 멈춤
rb.AddForce(-rb.velocity * stoppingForce);
}
// 가시 영역 제한 적용
Vector3 clampedPosition = mainCamera.WorldToViewportPoint(transform.position);
clampedPosition.x = Mathf.Clamp(clampedPosition.x, 0.05f, 0.95f); // 가로 제한
clampedPosition.y = Mathf.Clamp(clampedPosition.y, 0.05f, 0.95f); // 세로 제한
transform.position = mainCamera.ViewportToWorldPoint(clampedPosition);
if (!isClear && score >= 12)
{
DisplayClearMessage();
isClear = true; // Clear 상태로 변경하여 중복 호출 방지
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("icon"))
{
// 아이콘과 충돌했을 때 점수를 올림
IncreaseScore();
// 아이콘을 제거
Destroy(collision.gameObject);
}
}
private void IncreaseScore()
{
score++;
Debug.Log("Score: " + score);
// 여기에 점수를 표시하는 로직이나 게임 상태 업데이트 등을 추가할 수 있습니다.
// 예를 들어, 점수를 표시하는 UI 텍스트를 업데이트할 수도 있습니다.
// UI 텍스트 오브젝트의 ScoreText 컴포넌트를 찾아 점수를 설정해주는 코드를 추가할 수 있습니다.
// 예: FindObjectOfType<ScoreText>().SetScore(score);
}
public void DisplayClearMessage()
{
Debug.Log("Clear");
if (clearText != null)
{
clearText.text = "CLEAR"; // ClearText의 내용을 "Clear"로 업데이트
}
else
{
Debug.LogWarning("ClearText is not assigned.");
}
}
}
청휘석 inspector
※ 청휘석을 계속 복제 해야하기 때문에 Icon Prefab에 복제할 이미지를 연결해줘야함 !!
청휘석에 연결한 C# 스크립트
using UnityEngine;
public class IconManager : MonoBehaviour
{
public GameObject iconPrefab; // 아이콘 프리팹
public int maxIconCount = 18; // 최대 아이콘 개수
private Camera mainCamera;
private void Start()
{
mainCamera = Camera.main;
for (int i = 0; i < maxIconCount; i++)
{
SpawnIcon();
}
}
private void SpawnIcon()
{
Vector3 randomPosition = GetRandomPositionInViewport();
GameObject newIcon = Instantiate(iconPrefab, randomPosition, Quaternion.identity);
newIcon.tag = "icon"; // 생성된 아이콘에 "icon" 태그 할당
}
private Vector3 GetRandomPositionInViewport()
{
Vector3 randomViewportPosition = new Vector3(Random.value, Random.value, mainCamera.nearClipPlane);
Vector3 randomWorldPosition = mainCamera.ViewportToWorldPoint(randomViewportPosition);
randomWorldPosition.z = 0f; // z 축 위치를 0으로 설정하여 아이콘이 화면 위에 배치되도록 함
return randomWorldPosition;
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player") && other.gameObject.TryGetComponent(out aris_script player))
{
Destroy(gameObject); // 아이콘 삭제
// 모든 아이콘이 삭제되었는지 확인
GameObject[] icons = GameObject.FindGameObjectsWithTag("icon");
if (icons.Length == 0)
{
player.DisplayClearMessage(); // "Clear" 메시지 표시
}
}
}
}
수많은 시행착오 중 하나 ..
청휘석을 랜덤한 위치에 랜덤하게 생성하게 코드를 짰다가
무한대로 증식해서 컴퓨터 강제종료를 해야했음 . .
랜덤 생성 코드를 짤때는 주의하시오
이 게임을 만들면서
청휘석이 아리스에 닿으면 사라져야하는데,
안사라져서 사라지게 하는 것이 정말 힘들었다.
유튜브 강의도 보고 했는데
유튜브에 나오는 유니티 버전들은 나랑 달라서 따라하기 쉽지 않았음 . .
뭔가 제대로 공부하고 했으면 더 쉽게 했을 것 같다.
재밌는 경험이였음 !
프로젝트 할 때 유용하게 사용할 수 있을 것 같다 !
'공부일지' 카테고리의 다른 글
하현우가 제 앞으로 튀어나왔다면 믿으시겠습니까 / 리액트 공부일지 / 일렉조아 (1) | 2023.07.16 |
---|---|
락이 없는 인생은 인생이 아니다 ! (연세대 백주년기념관 J열 시야) (0) | 2023.07.01 |
정보처리기사 필기 2일 공부하고 합격하기 (0) | 2023.06.24 |
싸피 1학기를 마치며 상반기 총결산⭐ (0) | 2023.06.08 |
드디어 SQLD 합격 / 군포문화예술회관 시야 / 용산 CGV IMAX 후기 (0) | 2023.04.11 |