ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 AOS게임 만들기 - AOS란?,마우스커서 클릭한위치로 이동
    유니티 2022. 5. 18. 11:25

    유니티를 이용하여 AOS게임을 만들고 싶었습니다

    왜냐하면 제가 다이렉트 x 에 대한 지식이 전무해서 

    유니티엔진을 이용해 게임을 구현해보고 

    다이렉트 x로 다시한번 더만들어 보겠습니다.

     

    AOS게임의 시조격인 Aeon of Strife
    AOS게임의 대표

    우리는 이러한 게임들을 AOS,MOBA 게임이라고 부릅니다

     

    우선 필요한 기능들을 간단하게 생각해봅시다.

    기능1.이동기능 (마우스로 클릭한 위치로 이동)

    기능2.스탯(공격력,방어력,체력,마나,이동속도 등)

    기능3.공격 및 스킬(일반공격,스킬)

    기능4.상점,옵션,미니맵등 각종 UI

    기능5.매치메이킹 시스템

    기능6.미니언 AI(공격로를 따라 이동)

    롤의 UI시스템

    지금 생각나는건 이정도 기능이 필요할 것 같습니다.

    유니티는 unity 2020.3.15f2 personal버전을 이용해 제작해볼 생각입니다.

    네트워크는 포톤서버를 활용해 만들생각입니다. 

    저도 배우면서 하는 입장이라 많이 알지는 못하지만 우선 같이만들어봅시다.

     

    유니티 프로젝트를 첫 실행한 모습입니다 아무것도 없네요.

    저희는 마우스 클릭위치로 플레이어를 보내는 간단한 코드를 작성할 것 입니다.

    그럼 마우스 클릭과 클릭한 포인트가 서로 연동이 되야 할 것 입니다.

    우리는 raycast기능과Camera.main.ScreenPointToRay두가지를 이용해

    카메라가 보고있는 좌표중 클릭한 지점의 마우스 x,y값을 이용해

    카메라에서 움직여야할 위치에 raycast를 쏘아 맞춘 위치로 이동하는 간단한 코드를 작성해 보겠습니다.

    raycast는 레이저 포인터를 쏘는거라고 보시면 편할거 같네요.

    우선 player 오브젝트를 만들어 봅시다.

    저는 캡슐형태의 이 오브젝트를 player로 하겟습니다.

    이 오브젝트의 컴포넌트에 Player_Move 새스크립트 작성을 해줍니다.

    스크립트를 생성하였습니다

    스크립트를 생성 하였다면

    이제 스크립트를 편집하기위해 프로젝트 내의 Player_Move 스크립트를 편집해봅시다.

    저는 Visual Studio Code를 사용하여 편집할 것 입니다.

    이부분에서 자신의 에디터를 추가하여 사용할 수 있습니다.

    저는 코드를 사용하기 떄문에 코드로 교체해준 모습입니다.

    Player_Move 스크립트를 더블클릭하여 열어 볼까요?

    아무것도 없는 상태의 스크립트네요

    void Start()는 첫 프레임의 업데이트 전에 실행되고

    void Update()는 매 프레임마다 실행됩니다

    저희는 마우스 입력을 계속 받아주어야 하기 때문에

    Update()부분에 코드를 작성하겠습니다.

    우선 카메라 오브젝트를 사용하기 위해서는

    스크립트상에서도 카메라를 지정해주는 코드가 필요합니다.

    저희는 public으로 지정해서 다른 스크립트에서도 자유롭게 참조할 수 있도록 하겠습니다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player_Move : MonoBehaviour
    {   
        public Camera cam;
        void Start(){}
        void Update(){}
    }

    이런식으로 Camera를 cam이라고 부르겠다고 선언한뒤 다시

    유니티 화면을 보면

    스크립트를 다시 로드한뒤

    카메라를 지정할 수 있는 부분이 나타나게 됩니다.

    저희는 메인카메라를 선택하도록 하겠습니다.

    이제 스크립트로 돌아가서 플레이어 게임오브젝트 또한 퍼블릭으로 받아 설정해줍시다

    public gameobject player;

    를 카메라 선언아래에 추가해줍니다.

    ->유니티 상에서 선택해줍니다

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player_Move : MonoBehaviour
    {   
        public Camera cam;
        public GameObject Player;
        void Start(){}
        void Update(){
            if(Input.GetMouseButtonDown(0))//마우스 클릭이 됬다면
            {
            RaycastHit hit;
                if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit,Mathf.Infinity))//레이케스트(마우스 클릭위치,레이케스트가 맞은곳,무한대기)
                {
                 Player.transform.position=hit.point;//플레이어의 위치를 레이케스트가 맞은곳으로 이동   
                }
            }
        }
    }

    매프레임당 마우스클릭이 됬다면 레이케스트를 쏘아보고 맞았다면(리턴값 참 거짓)

    맞은곳의 정보를 hit으로 한다 플레이어 오브젝트의 컴포넌트 중에 transform이라는 컴포넌트의 positon(x,y,z)가

    레이케스트가 맞은곳(x,y,z)값으로 바뀐다는 코드입니다.

    물론 이런식으로 코드를 작성하면 마우스 클릭한 위치로 순간이동되는 기능이 되버리기떄문에

    프레임당 일정한 속도로 이동하도록 만들기위해서는 코드를 좀 바꿀 필요가 있습니다.

    이동하는 코드는 유니티의 navigation에서 제공해주기 때문에 player의 컴포넌트에 navmesh를 추가하겠습니다.

    player와 카메라 때처럼 public으로 네비게이션을 선언해 선택해야합니다

    네비게이션을 통해 이동하기 위해서는 따로 반복문을 사용할 필요없이

    최종목적지만 지정해주면 되기 때문에

        public void movemont(Vector3 pos){
            agent.SetDestination(pos);        
        }

    이렇게 따로 함수를 빼서 사용하셔도 괜찮습니다

    네이게이션은 유니티에서 경로들을 bake해주지 않으면 어떤식으로 움직여야하는지 알지 못하기 때문에

    지형데이터인 터레인을 생성해줍시다.

    생성된 터레인

    메뉴에서 창->AI->네비게이션을 열어줍니다.

    네비게이션 창이 추가된 모습을 볼수 있습니다. bake를 통해 이동할 수 있는곳들을 계산해주겠습니다.

    베이크된 터레인오브젝트

    이제 이 파란색으로표시된 부분들은 네비게이션이 이동할수있는위치로 변한 것 입니다.

    코드를 완성하셨다면 잘작동하는것을 확인 할 수 있습니다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player_Move : MonoBehaviour
    {   
        public Camera cam;
        public GameObject Player;
        public UnityEngine.AI.NavMeshAgent agent;
        void Start(){}
        void Update(){
            if(Input.GetMouseButtonDown(0))//마우스 클릭이 됬다면
            {
            RaycastHit hit;
                if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit,Mathf.Infinity))//레이케스트(마우스 클릭위치,레이케스트가 맞은곳,무한대기)
                {
                    movemont(hit.point);//플레이어의 위치를 레이케스트가 맞은곳으로 이동   
                }
            }
        }
        public void movemont(Vector3 pos){
            agent.SetDestination(pos);        
        }
    }

    완성된 코드를 끝으로 플레이어 이동은 우선 마치겠습니다.

    댓글

Designed by Tistory.