(C# 및 UNITY) 롤링 볼

https://learn.unity.com/project/roll-a-ball-1

롤링 볼 – Unity 학습

Roll-a-Ball 학습 프로그램을 소개합니다.이 학습 프로젝트에서 다루는 주제는 다음과 같습니다. Unity 편집기 및 기본 제공 기능을 사용하여 간단한 게임 환경 설정 사용자 지정 스크립트 만들기

learn.unity.com

이 예를 보고 배우십시오!

게임 구현 환경을 만들고 코드를 입력해야 합니다.

아직 초보자이기 때문에 기존 도형으로 작업할 수 있습니다.

스크립트를 입력하려면 C# 언어를 알아야 하므로 주의 깊게 공부하십시오.

1. 플레이어 컨트롤러

에이전트를 움직이게 하는 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed; //물체의 속도, public float형은 유니티 에디터에서 직접 값을 입력할 수 있다. 당장 값을 입력해주지 않아도 괜찮다
    private Rigidbody rb; //우리가 정한 물리엔진

    // Start is called before the first frame update
    void Start() // 첫 번째 프레임이 나올 때 항상 실행되는 함수, 전에 정한 물리엔진을 불러올 것이다.
    {
        rb = GetComponent<Rigidbody>();
        
    }

    // Update is called once per frame
    void Update() //일단 여기서는 업데이트 함수를 쓰지 않을 것이다.
    {
        
    }

    // 업데이트 함수는 매 프레임마다 실행됨
    // fixed 업데이트 함수는 간격?을 두고 실행됨

    void FixedUpdate() // 고정된 프레임 수마다 실행되는 함수
    {
        // 키보드로부터 입력을 받는 것
        float moveHorizontal = Input.GetAxis("Horizontal"); //수평으로 움직임
        float moveVertical = Input.GetAxis("Vertical"); //수직으로 움직임

        // 입력받은 값을 물리엔진에 적용
        Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);

        //함수에 대한 자세한 내용을 알고 싶을 땐 unity api를 검색, 구글 검색
        rb.AddForce(movement * speed);
    }
}

2. 카메라 컨트롤러

게임 화면을 표시하기 위해 카메라를 제어하는 ​​코드

항상 프록시를 따르도록 카메라를 설정합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
	// 스크립트에서 public타입의 변수는 유니티 에디터에서 지정할 수 있다.
    public GameObject player; // 플레이어가 public, 아직 정해지지 않음
    private Vector3 offset; // 카메라와의 거리값

    // Start is called before the first frame update
    void Start() // 처음에 프레임을 불러왔을 때 실행되는 함수
    {
        // 초기 플레이어 위치와 카메라 위치의 차이를 구함
        // camera.transform이 아닌 이유는 이 코드를 camera에 대입을 시킬 것이기 때문, 그럼 자동으로 카메라 정보가 들어감
        offset = transform.position - player.transform.position;
    }

    // Update is called once per frame
    void Update() // 아직 당장은 안 쓸 것
    {
        
    }

    // 유니티에는 굉장히 많은 업데이트 함수가 존재한다.
    // 모든 업데이트가 실행이 되고 맨 마지막에 실행이 되는 업데이트 함수다.
    // 카메라 같은 경우는 플레이어가 움직이고 나서 최종적으로 나중에 움직이기 때문에 
    void LateUpdate()
    {
        // 매 순간 플레이어 위치에 초기 차이값을 더해준다.
        // 결과적으로 카메라가 플레이어의 위치가 바껴도 계속 카메라와 플레이어의 간격이 유지된다.
        transform.position = player.transform.position + offset;
    }
}

3. 회전 큐브

보상을 받는 큐브를 완벽하게 회전시킵니다.

중심 축이 약간 기울어지도록 큐브를 회전합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    // 매 프레임마다 큐브가 돌아가도록 만들것이다.
    void Update()
    {
    	// 돌아가는 축 정보가 들어간다.
    	// time.deltatime -> 시간마다 돌아가야 하니까
        transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
    }
}

4. 플레이어 충돌 감지 추가

플레이어가 큐브와 충돌할 때 플레이어가 충돌할 때 큐브가 피커가 될 충돌력과 크기를 설정하는 코드입니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed; 
    private Rigidbody rb; 

    // Start is called before the first frame update
    void Start() 
    {
        rb = GetComponent<Rigidbody>(); 
    }

    // Update is called once per frame
    void Update() 
    {
        
    }

    void FixedUpdate() 
    {
        float moveHorizontal = Input.GetAxis("Horizontal"); 
        float moveVertical = Input.GetAxis("Vertical"); 

        Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);

        rb.AddForce(movement * speed);
    }

	// 플레이어 컨트롤러가 속한 플레이어가 다른 게임 오브젝트와 만났을 때 이 함수가 호출되고
    void OnTriggerEnter(Collider other)
    {
    	// 조건문. 모든 객체마다 태그를 붙일 수 있다. 명찰 같은 느낌
        if (other.gmaeObject.CompareTag("PickUp")) //픽업이라는 명찰을 단 오브젝트와 만났을 때
        {
        	// 해당 게임 오브젝트는 active가 비활성화된다. 멈춘다? 먹어진다. 없어진다.
            other.gameObject.SetActive(false);
        }
    }
}

5. 채점

플레이어가 큐브와 충돌할 때 보너스를 받을 수 있는 코드입니다. 이것을 PlayerController 파일에 넣기만 하면 됩니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed; 
    private Rigidbody rb;
    private int count; // 점수

    // Start is called before the first frame update
    void Start() 
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
    }

    // Update is called once per frame
    void Update() 
    {
        
    }

    void FixedUpdate() 
    {
        float moveHorizontal = Input.GetAxis("Horizontal"); 
        float moveVertical = Input.GetAxis("Vertical"); 

        Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);

        rb.AddForce(movement * speed);
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp"))
        {
            other.gameObject.SetActive(false);
            count = count + 1; // 충돌, 점수를 획득
        }
    }
}

6. 텍스트 추가

다음은 플레이어에 점수 및 승리 문구를 표시하는 텍스트를 추가하는 코드입니다. 다시 말하지만 이것을 PlayerController 파일에 추가할 수 있습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.UI; // UI를 생성했으므로

public class PlayerController : MonoBehaviour
{
    public float speed; 
    private Rigidbody rb;
    private int count;
	
	// 텍스트 요소를 추가한다.
    public Text CountText; 
    public Text WinText;

    // Start is called before the first frame update
    void Start() 
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetText(); // 처음 시작할 때 텍스트를 불러주고
    }

    // Update is called once per frame
    void Update() 
    {
        
    }

    void FixedUpdate() 
    {
        float moveHorizontal = Input.GetAxis("Horizontal"); 
        float moveVertical = Input.GetAxis("Vertical"); 

        Vector3 movement = new Vector3(moveHorizontal, 0, moveVertical);

        rb.AddForce(movement * speed);
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetText(); // 충돌해 점수를 획득할 때마다 텍스트를 불러준다.
        }
    }
    
	// 텍스트와 관련된 함수를 만든다. 
    void SetText()
    {
        if (count >= 5) // 픽업들 5개를 다 획득을 했다면
        {
            CountText.text = ""; // 이겼으므로 더 이상의 카운트는 하지 않아도 된다.
            WinText.text = "You Win!" // 이겼다!
        }
        else // 아직 다 획득하지 못했다면
        {
            CountText.text = "Count : " + count.ToString(); // 점수 
            // count가 int값이므로 문자열로 바꿔준다
            // c#에서는 문자열과 문자열의 덧셈이 가능하다
            WinText.text = "";
        }
    }
}

Roll-a-Ball 예제를 구현하는 비디오

롤링볼 구현 동영상

이와 같이 볼 에이전트가 회전하는 대상을 터치하면 보상이 1포인트 증가한 것을 알 수 있습니다.

Similar Posts

  • 주식 실물자산 투자전략

    주식 시장에 투자하는 것은 가장 수익성 있는 투자 방법 중 하나입니다. 그러나 최근 몇 년 동안 실물 자산 투자 전략이 주식 시장에서 점점 인기를 얻고 있습니다. 실물자산은 주식과 달리 부동산, 금, 식품 등 물질적 가치가 있는 것입니다. 이러한 물리적 자산은 투자 수익을 안정화하는 데 도움이 될 뿐만 아니라 인플레이션과 같은 위험을 효과적으로 감소시킵니다. 이 기사에서는…

  • (동의보감) 침(침)

    타액(침) 입에서 끊임없이 침이 나오는 것을 침흘림이라고 합니다. 【재능 지적】 ○ 원은 비장액이다. 비에 열이 있으면 연이 날아갑니다. 【네이칭저우】 ○ 황제가 “연에서 나오는 공기가 무엇이냐?”고 묻자 기백은 “음식이 뱃속에 들어가서 뱃속에 열이 있으면 벌레가 움직인다. ○ 연은 항상 입에서 물을 뚝뚝 흘리고 잘 웃고 말을 잘 못하며 맥박이 크다. 생강. 5일 후 연이 멈췄고 웃음도…

  • 칸디다 질염질정 효과 비교 후기

    칸디다 질염은 많은 여성들이 경험하는 흔한 질환으로, 증상을 완화할 수 있는 여러 가지 질정들이 존재합니다. 이번 포스팅에서는 다양한 칸디다 질염 질정의 효과를 비교하고, 효과적인 사용법에 대해 알아보겠습니다. 칸디다 질염의 정의와 증상 칸디다 질염은 칸디다균이 과도하게 증식하여 발생하는 질환으로, 주로 가려움증, 분비물 증가, 불쾌한 냄새 등의 증상을 유발합니다. 이러한 증상은 성관계나 일상 생활에 어려움을 줄 수…

  • 부천협박죄 형량변호사 도움에 고심한다면_

    부천 협박 죄형 양 변호인의 조력에 고심한다면_ 하지만 실질적으로는 술을 마신 후에 물의를 어떻게 진전시킬 것인지를 이해하게 된다고 말했습니다.그러나 B씨는 외도에 대한 보복 운전을 하면서 함께 문제를 풀어 보세요.우려가 많아 자신이 한쪽에 대고 뭔가의 행위를 하거나 매우 무겁게 내릴 수 있기 때문에 그에 따른 죄질이 무겁다고 말했습니다.사건 발생 경위에 대한 해악의 고지와 평가될지는 통상의 기준…

  • (퀵캠퍼스) 데이터 분석 초심자 수련회 8호 학습일지 (1/6)

    데이터 분석 훈련소 8호 학습일지(1/6) 1. 왜 엑셀을 배워야 할까요? ERP(전사적자원관리시스템)에 데이터가 어떻게 축적되든 그 결과는 보통 엑셀을 이용해 추출해 처리한다. 따라서 엑셀의 기능을 이해하고 사용법을 익혀 업무를 빠르고 정확하게 수행하는 것이 매우 중요합니다. 엑셀을 잘 활용한다는 것은 사용자 입장에서 보고 목표에 맞게 데이터를 정리하는 것을 의미합니다. → Excel 사용의 장점 요약 – 사용하기 쉬운…

  • 라로슈포제 시카플라스트밤 B5 내돈의 내산을 써봤는데

    오~n년만에 잘 맞는 보습아이템을 찾아서 너무 행복해요 ㅋㅋ 아니 친구들이 네~ 예전부터 좋아한다고 극찬하면서 추천할 때부터 쓸걸 그랬어요. 친구의 말을 듣지 못한 나 자신, 매우 반성중… 아무튼 지금이라도 사용하길 잘했네요.보습 아이템 찾기 정말 어렵잖아요? 널리 퍼져있는게 시범이지만.. 잘 맞는건 정말 하늘의 별따기 수준!! 혹시 도움이 될까봐 제 돈을 내서 포스팅 해봅니다. 라 롯슈 포제 시…