본문 바로가기
유니티 최고/유니티 구현

유니티(Unity) 간단한 공 게임 기능 구현 1 - 공의 이동, 장애물 설치, 코인(Coin)

by Lee_story_.. 2022. 8. 24.
728x90

 

 

이번엔 게임에 사용될만한 그러한 기능들을 하나씩 만들어보겠습니다!

 

 

맵구성은 여러분들이 만들어 주세요!

 

 

 

 

 

 

 

먼저 공 캐릭터를 움직이기 위한 부분부터 만들어 보겠습니다.

 

 

 

이부분은 일반 캐릭터를 움직이는 느낌이 아닌 공을 툭툭 손으로 친다는 느낌? 으로 만들어 보았습니다.

 if (Input.GetKeyDown(KeyCode.Space)){//점프
            GetComponent<Rigidbody>().AddForce(Vector3.up * 400);
        }

일단 키입력을 받고 , 원하는 방향으로 힘을주어 공을 튕겨내었습니다.

 

 

 

그리고 ball속성창에서 Rigidbody컴포넌트를  추가 하면됩니다. 

 

 

완성!

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

public class Ball : MonoBehaviour
{

    float point;
    // Start is called before the first frame update
    void Start()
    {
        point = transform.position.z;
    }

    // Update is called once per frame
    void Update()
    {
        float distance;
        distance = transform.position.z - point;

        if (Input.GetKeyDown(KeyCode.Space)){//점프
            GetComponent<Rigidbody>().AddForce(Vector3.up * 400);
        }

        if (Input.GetKeyDown(KeyCode.W))// 앞
        {
            GetComponent<Rigidbody>().AddForce(Vector3.forward * 400);
        }

        if (Input.GetKeyDown(KeyCode.S))//뒤
        {
            GetComponent<Rigidbody>().AddForce(Vector3.back * 400);
        }

        if (Input.GetKeyDown(KeyCode.A))//왼
        {
            GetComponent<Rigidbody>().AddForce(Vector3.left * 400);
        }

        if (Input.GetKeyDown(KeyCode.D))//오
        {
            GetComponent<Rigidbody>().AddForce(Vector3.right * 400);
        }


        //Debug.Log(distance);

    }
}

 

 

 

 

 

다음은 코인부분!

 

먼저 코인이라 하면 빙글빙글 돌아가야 약간 게임 같겠죠

transform.Rotate(new Vector3(0, 0, 100f) * Time.deltaTime);//회전

이런식으로 회전을 주더라구요

 

 

그리고 코인을 먹으면 점수를 올리고 , 사라지게 하는 부분!

private void OnTriggerEnter(Collider other) // 충돌 감지
    {
        if (other.gameObject.name == "Ball")
        {
            GameObject.Find("GameManager").SendMessage("GetCoin");// 게임메니저에서 함수 불러오기
            Destroy(gameObject);
        }
    }

 

 

이 부분에서 게임 메니저라는 개념이 나오는데 

제가 이해하기로는 게임내의 자주사용되는 함수들을 모아 관리하는 헤더파일 느낌이였습니다.

 

 

 

게임 메니저를 하나 만들고 아래처럼 추가해줍시다.

    public int coinCount = 0;
    
    public TextMeshProUGUI coinText;
    public Text coinText1;

    void GetCoin()
    {
        coinCount++;
        coinText.text = coinCount + "~";
        coinText1.text= coinCount + "개";

    }

 

 

 

 

코인도 끝!

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

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

    // Update is called once per frame
    void Update()
    {
         transform.Rotate(new Vector3(0, 0, 100f) * Time.deltaTime);//회전
    }

    private void OnTriggerEnter(Collider other) // 충돌 감지
    {
        if (other.gameObject.name == "Ball")
        {
            GameObject.Find("GameManager").SendMessage("GetCoin");// 게임메니저에서 함수 불러오기
            Destroy(gameObject);
        }
    }
}

 

 

 

 

 

다음은 장애물!

가만히 있으면 재미가 없죠... 열심히 이동시켜 줍시다!

 

먼저 속도를 선언해주고 

장애물을 계속 x축으로 이동시켜주다가?

6이되면 방향변경, -6이 되면 방향변경을 통해  좌우로 왔다갔다 하게 만들어 줍시다.

    public float delta = 0.1f;//속도 선언
    
    /~~~~~
    
    
    void Update()
    {
        float newXPosition = transform.localPosition.x + delta;//장애물 이동
        transform.localPosition = new Vector3(newXPosition, transform.localPosition.y, transform.localPosition.z);
        
        if (transform.localPosition.x < -6)
        {
            //delta = 0.1f;
            delta *= -1;
        }
        else if(transform.localPosition.x>6)
        {
            //delta = -0.1f;

            delta *= -1;
        }
    }

 

 

 

위 아래 이동하는 부분도 만들어 줄수있습니다.

 

void Update()
    {
        float newXPosition = transform.localPosition.y + delta;
        transform.localPosition = new Vector3(transform.localPosition.x, newXPosition, transform.localPosition.z);

        if (transform.localPosition.y > 10)
        {
            //delta = 0.1f;
            delta *= -1;
        }
        else if(transform.localPosition.y < 0)
        {
            //delta = -0.1f;

            delta *= -1;
        }
    }

 

 

 

 

 

그리고 만약 공으로 플레이하다 장애물과 충돌시 공이 튕겨나가도록하는부분도 만들어 줍시다.

 

private void OnCollisionEnter(Collision collision)//공과 장애물 충돌
    {
        Debug.Log(collision.gameObject.name + "충돌");

        Vector3 direction = transform.position - collision.gameObject.transform.position;//방향

        direction = direction.normalized * 1000;//방향*세기

        collision.gameObject.GetComponent<Rigidbody>().AddForce(direction);
    }

 

 

 

 

 

장애물도 끝!

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

public class Obstacle : MonoBehaviour
{
    public float delta = 0.1f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float newXPosition = transform.localPosition.x + delta;//장애물 이동
        transform.localPosition = new Vector3(newXPosition, transform.localPosition.y, transform.localPosition.z);
        
        if (transform.localPosition.x < -6)
        {
            //delta = 0.1f;
            delta *= -1;
        }
        else if(transform.localPosition.x>6)
        {
            //delta = -0.1f;

            delta *= -1;
        }
    }

    private void OnCollisionEnter(Collision collision)//공과 장애물 충돌
    {
        Debug.Log(collision.gameObject.name + "충돌");

        Vector3 direction = transform.position - collision.gameObject.transform.position;

        direction = direction.normalized * 1000;

        collision.gameObject.GetComponent<Rigidbody>().AddForce(direction);
    }
}

 

 

 

그리고 마지막으로

 

바닥 액터에 나머지들을 자식으로 넣어주면 다같이 이동 가능합니다!

 

 

다음글로 오겠습니다!

 

 

 

댓글