유니티

유니티 총쏘기 게임 만들기 - 1 캐릭터에 총 달기

당혜성 2025. 3. 28. 22:31

패키지 옮기기

 

Aseets -> Export Package -> 알아서 저장 -> 새로운 프로젝트 하나 생성 

 

Assets -> Import Package -> Custom package 클릭 후 저장한 곳에서 임포트를 하자.

 

선택

 

임포트를 하면 된다.

 

그리고 Scenes에 SampleScene은 삭제해주고, CoinScene를 눌러 Don't save를 눌러주자

 

깜빡하고 캡처를 못했다. 아마 저대로 했다면 정상적으로 우리가 만들었던 코인 먹기 게임이 나왔을 것이다.

 

그리고 이 프로젝트에 있는 모든 coin관련된것을 모두 지워버린다. 스크립트도 포함. 그 후 밑에 에러가 나올 텐데, GamaManager 스크립트를 들어가자

 

GameManager 스크립트

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement; //2차 추가
public class GameManager : MonoBehaviour
{
    public GameObject winpanel; //추가된거
    public Text CoinText;
    int score;
    void Start()
    {
        
    }


    public void Restart() //2차 추가
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
    
}

 

Palyer 스크립트

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

public class palyer : MonoBehaviour
{
    public GameManager gameManager;
    public Rigidbody rbody;
    public FixedJoystick fixedJoystick;
    public Vector3 moveDir;
    public float moveSpeed;
    
    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal") + fixedJoystick.Horizontal; 
        float z = Input.GetAxisRaw("Vertical") + fixedJoystick.Vertical; 
        moveDir = new Vector3(x, 0 ,z); 
        moveDir.Normalize();
    }

    private void FixedUpdate()
    {
        rbody.MovePosition(rbody.position + moveDir * moveSpeed);
    }


}

 

총구 만들기

Palyer를 우클릭 -> 3D Object -> Cube 생성 -> 이름 gun으로 변경

 

Scale X 0.2 Y 0.2 Z 0.5 로 만들어 주고 Position은 Z만 0.7로만 하자.

 

그럼 코마냥 이렇게 튀어나와 있다. 좀 낮다 싶으면 Position에서 Y를 0.5로 올리자. 

 

그리고 gun 안에 GameObject를 생성 후, 이름을 Muzzle로 바꿔주자.

우리는 마우스에서 카메라 방향으로 레이저를 쏜다. 바닥을 터치했으면 캐릭터가 회전할 것이다.

 

땅바닥을 하나 복사해 주고, 크기를 10 10 10으로 해준다. Mesh Renderer를 체크 해제해 주고, 오른쪽 상단에 Tag 옆에 Layer를 누르고, Add Rayer를 눌러준다. 그리고 대충 빈 곳에 MouseRay라고 적어주고 바꿔주면 된다.

 

Palyer 스크립트에 이렇게 작성해 준다.

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

public class palyer : MonoBehaviour
{
    public GameManager gameManager;
    public Rigidbody rbody;
    public FixedJoystick fixedJoystick;
    public Vector3 moveDir;
    public float moveSpeed;

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal") + fixedJoystick.Horizontal;
        float z = Input.GetAxisRaw("Vertical") + fixedJoystick.Vertical;
        moveDir = new Vector3(x, 0, z);
        moveDir.Normalize();

        //회전 태그가 메인 카메라인 카메라에 자동 참조
        if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out RaycastHit hit,
            float.MaxValue, 1 << LayerMask.NameToLayer("MouseRay")))
        {
            print(hit.point);  
        }
    }
    


    private void FixedUpdate()
    {
        rbody.MovePosition(rbody.position + moveDir * moveSpeed);
    }
}

LayerMask를 사용할 때에는 1 << 이 필수다.

 

그후 저장하면 유니티에 가서 실행해 보면 마우스 좌표가 나온다.

 

마우스 방향 바라보기

Palyer 스크립트

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

public class palyer : MonoBehaviour
{
    public GameManager gameManager;
    public Rigidbody rbody;
    public FixedJoystick fixedJoystick;
    public Vector3 moveDir;
    public float moveSpeed;

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal") + fixedJoystick.Horizontal;
        float z = Input.GetAxisRaw("Vertical") + fixedJoystick.Vertical;
        moveDir = new Vector3(x, 0, z);
        moveDir.Normalize();

        //회전 태그가 메인 카메라인 카메라에 자동 참조
        if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out RaycastHit hit,
            float.MaxValue, 1 << LayerMask.NameToLayer("MouseRay")))
        {
            Vector3 lookDir = hit.point - transform.position;
            lookDir.y = 0;
            transform.LookAt(transform.position + lookDir);
        }
    }
    


    private void FixedUpdate()
    {
        rbody.MovePosition(rbody.position + moveDir * moveSpeed);
    }
}

이렇게 넣으면 마우스 가 움직이는 대로 캐릭터가 움직인다.