ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 AOS게임 만들기 - 마우스커서 클릭한위치로 이동(+),카메라이동
    유니티 2022. 5. 19. 12:03

    player.transform.position전시간의 마우스 커서 이동은 대상이 뭐가 됬든 우선 이동하고 보는 코드였습니다

    그러나 만약 플레이어나 다른 오브젝트가 있다면 그위에 올라서는게 아니라 클릭하더라도 공격하거나주변 가장 가까운곳에서 멈춰야하는데 저희의 코드로는 레이캐스트가 구분없이 모든 포인트를 반환하기 때문에 플레이어를 클릭한다면

    플레이어의 머리 꼭대기에 올라가있을수 있으니 그부분을 

    태그로 구분하여 땅인지 아닌지 판단하고 땅이라면 그위치로 이동

    적인지 아닌지 판단하고 적이라면 공격하도록하는 코드를 추가하면 될것 같습니다.

    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))//레이케스트(마우스 클릭위치,레이케스트가 맞은곳,무한대기)
                {   if(hit.collider.tag=="땅")
                    {
                        movemont(hit.point);//플레이어의 위치를 레이케스트가 맞은곳으로 이동  
                    }
                    if(hit.collider.tag=="오브젝트")
                    {
                        Debug.Log("오브젝트에 맞음");
                    } 
                }
            }
        }
        public void movemont(Vector3 pos){
            agent.SetDestination(pos);        
        }
    }

    if문 두개로 간단하게 처리해보았습니다

    각 오브젝트의 태그를 바꿔줌으로써 구분 할 수 있게 되었습니다

    땅으로쓰이는 터레인데이터의 태그를 땅으로 생성해 지정해줍시다.

    그러나 AOS는 혼자하는 게임이 아니기 떄문에

    오브젝트 중에서도 상대팀(공격가능한팀)인지 확인하는코드와

    같은팀이라면 따라간다든지 그위치로 이동한다던지하는 것으로 하면 될것 같습니다

    카메라이동

     

    씬에서 보이는 카메라는 이렇지만 실제 게임에 들어가게 되면

    이런식으로 카메라위치, 기울기 등에 따라 다른모습을 보입니다.

    AOS게임에서는 카메라가 살짝 아래를 비추고 캐릭터를 따라다니며

    마우스커서가 화면끝에 닿을때 카메라가 마우스방향을 따라 이동하게됩니다.

    저희는 오늘 이 카메라를 한번 구현해보도록 하겠습니다.

    카메라 오브젝트를 선택하고 카메라의 컴포넌트에

    Camera_Work라는 스크립트를 추가하여 편집해봅시다.

    카메라가 플레이어를 따라다니려면 어떤정보가 필요할것 같나요?

    player.transform.position

    플레이어오브젝트의 트랜스폼 컴포넌트의 포지션값입니다.

    트랜스폼 컴포넌트는 위치,회전,크기를 저장하는 유니티 기본 컴포넌트입니다

     

    플레이어의 위치는 몸체의 중앙이아닌 바닥의 값이필요할것입니다.

    빈오브젝트를 생성하여 전에 만들어둔 플레이어 오브젝트를 자식으로 만들어주고 스크립트와 네비게이션을 옮겨주도록합시다.

    그리고 포지션을 0 0 0 으로 교체해줍시다.

    플레이어가 땅에 박혀버렸네요

    이부분은 자식오브젝트으 y값을 조정하면 해결될 것 입니다.

    자식오브젝트의 포지션 값은 부모오브젝트의 포지션 값을 기준으로 움직입니다.

    부모오브젝트가 1 0 0 이라면 자식오브젝트가 0 0 0 이라고하여도 x방향으로 1만큼 같이 움직이게됩니다.

    실제로움직이는건 부모오브젝트이고 자식오브젝트는 0 0 0 에서도 움직일수 있게됩니다.

    자식오브젝트의 y값을 1로 주면 땅에서 빠져나올수있다 그러나 부모는 0 0 0 좌표에 있다
    AOS게임의 카메라뷰를 구현해봤음

    카메라의 위치 회전값을 위 사진처럼바꿔주면 게임상에서 봣을때 AOS게임처럼 볼수 있습니다.

    AOS카메라의 특징

    1.캐릭터를 따라옴

    2.캐릭터를 따라오지않고 마우스위치로 카메라를 옮길수있음

    3.카메라 줌인 줌아웃

    4.스페이스바,카메라고정키를 이용해 캐릭터를 따라가거나 안따라가는것을 정할 수 있음

     

     

     

    자 이제 카메라 오브젝트의 스크립트를 보러갈까요?

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Camera_Work : MonoBehaviour
    {
      public GameObject player;
        private bool follow = true; //카메라가 플레이어를 따라올지 말지설정
        public float camSpeed = 20; //마우스를 따라 이동할 속도
        public float screenSizeThickness = 10; //화면의 경계선의 굵기
        private float camFov; //카메라의 화각(시야각)
        public float zoomspeed=10;//줌인 속도
        private float mouseScrollInput;//마우스 스크롤 입력값
        void Start(){camFov = gameObject.GetComponent<Camera>().fieldOfView; //카메라의 화각(시야각)을 가져옴
        transform.position = new Vector3(player.transform.position.x-15,20,player.transform.position.z-15);//카메라의 위치를 플레이어의 위치로 설정
        }
        void Update()
        {   
            Vector3 pos = transform.position;
            if(Input.GetKeyDown(KeyCode.Y)){
                   if(follow == false){follow = true;}else{follow = false;}
            }
            if(follow == true){ //카메라가 플레이어를 따라오게함
                transform.position =new Vector3(player.transform.position.x-15,20,player.transform.position.z-15);   
            }
            if(follow == false){ //카메라가 플레이어를 따라가지 않는다면
            if(Input.GetKey(KeyCode.Space)){ // 스페이스바를 누르고있는지확인 누른다면 플레이어의 위치로 이동
    
                pos=new Vector3(player.transform.position.x-15,20,player.transform.position.z-15);   
            }
            //up 마우스의 위치를 입력받아서 스크린의 높이에서 화면경계선의 굵기 만큼뺀값보다 크면 카메라의 위치를 올린다.
            //경계선에 마우스가 있는지 확인
            if(Input.mousePosition.y >= Screen.height - screenSizeThickness){
                pos.x += camSpeed * Time.deltaTime;
                pos.z += camSpeed * Time.deltaTime;
            }
            //Down 마우스의 위치를 입력받아서 스크린의 높이에서 화면경계선의 굵기 만큼뺀값보다 작으면 카메라의 위치를 내린다.
            //경계선에 마우스가 있는지 확인
            if (Input.mousePosition.y <= screenSizeThickness){
                pos.x -= camSpeed * Time.deltaTime;
                pos.z -= camSpeed * Time.deltaTime;
            }
            //Right 마우스의 위치를 입력받아서 스크린의 너비에서 화면경계선의 굵기 만큼뺀값보다 크면 카메라의 위치를 오른쪽으로 옮긴다.
            //경계선에 마우스가 있는지 확인
    
            if (Input.mousePosition.x >= Screen.width - screenSizeThickness){
                pos.x += camSpeed * Time.deltaTime;
                pos.z -= camSpeed * Time.deltaTime;
            }   
            //Left 마우스의 위치를 입력받아서 스크린의 너비에서 화면경계선의 굵기 만큼뺀값보다 작으면 카메라의 위치를 왼쪽으로 옮긴다.
            //경계선에 마우스가 있는지 확인
            if (Input.mousePosition.x <= screenSizeThickness){
                pos.x -= camSpeed * Time.deltaTime;
                pos.z += camSpeed * Time.deltaTime;
                }  
                //실제 이동코드
            transform.position = pos; 
            }
            //카메라 줌인
            mouseScrollInput = Input.GetAxis("Mouse ScrollWheel");//마우스 휠의 값을 받아옴 위로 = + , 아래로 = -
            camFov-=mouseScrollInput*zoomspeed; //줌인 속도만큼 값을 빼줌
            camFov = Mathf.Clamp(camFov,30,60); // 최소값과 최대값을 제한해줌
            gameObject.GetComponent<Camera>().fieldOfView = Mathf.Lerp(gameObject.GetComponent<Camera>().fieldOfView,camFov,zoomspeed);
            //카메라의 화면 각도를 줌인 속도만큼 변경
        
    
        }
    }

    카메라 오브젝트의 스크립트 카메라워크의 플레이어와 아까 생성한 빈 오브젝트를 이어주면

    빈오브젝트가 이동할때 카메라 팔로우가 켜져있다면(y를 누른다)프레임마다 카메라가 캐릭터를 따라가게 됩니다.

    카메라이동

    궁금한게 있으시다면 댓글 남겨주세요~

    댓글

Designed by Tistory.