공부일지

유니티로 게임 만들기를 해보았다.

peach_h 2023. 7. 1. 14:54

 

과제를 하면서 유니티로 게임 만들기를 해보았다 !

유니티는 원하는 이미지에 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" 메시지 표시
            }
        }
    }
}

 


수많은 시행착오 중 하나 .. 

청휘석을 랜덤한 위치에 랜덤하게 생성하게 코드를 짰다가

무한대로 증식해서 컴퓨터 강제종료를 해야했음 . .

랜덤 생성 코드를 짤때는 주의하시오

 

 

이 게임을 만들면서

청휘석이 아리스에 닿으면 사라져야하는데,

안사라져서 사라지게 하는 것이 정말 힘들었다.

 

유튜브 강의도 보고 했는데

유튜브에 나오는 유니티 버전들은 나랑 달라서 따라하기 쉽지 않았음 . .

뭔가 제대로 공부하고 했으면 더 쉽게 했을 것 같다.

재밌는 경험이였음 !

프로젝트 할 때 유용하게 사용할 수 있을 것 같다 !