같은 프레임 내에서 스크립트의 Update함수를 호출할 경우 호출되는 순서가 중요할 때가 있다고 합니다.

카메라의 이동 처리가 그런 예입니다.

캐릭터가 이동한 후에 조금 늦게 카메라가 따라가면 이상합니다.

그러니 우리는 조금 이것을 바꿀 필요가 있습니다.

파랑색으로 표시된 것을 차례로 클릭

요걸

요렇게 바꾸고 Apply를 누르면 끝이 납니다.

그리고는 재생 버튼을 눌러서 확인을 해 보세요!

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

이번에도 똑같이 일단 Assets에 FollowCamera라는 스크립트 파일을 준비합니다.

그리고는 이렇게 작성을 합시다.

using UnityEngine;
using System.Collections;

public class FollowCamera : MonoBehaviour {
    public float distance = 5.0f;
    public float horizontalAngle = 0.0f;
    public float rotAngle = 180.0f;
    public float verticalAngle = 10.0f;
    public Transform lookTarget;
    public Vector3 offset = Vector3.zero;

    InputManager inputManager;
 // Use this for initialization
 void Start () {
        inputManager = FindObjectOfType<InputManager>();
 }
 
 // Update is called once per frame
 void LateUpdate () {
        if (inputManager.Moved())
        {
            float anglePerPixel = rotAngle / (float)Screen.width;
            Vector2 delta = inputManager.GetDeltaPosition();
            horizontalAngle += delta.x * anglePerPixel;
            horizontalAngle = Mathf.Repeat(horizontalAngle, 360.0f);
            verticalAngle -= delta.y * anglePerPixel;
            verticalAngle = Mathf.Clamp(verticalAngle, -60.0f, 60.0f);
        }
        if (lookTarget != null)
        {
            Vector3 lookPosition = lookTarget.position + offset;
            Vector3 relativePos = Quaternion.Euler(verticalAngle, horizontalAngle, 0) * new Vector3(0, 0, -distance);
            transform.position = lookPosition + relativePos;
            transform.LookAt(lookPosition);
            RaycastHit hitInfo;
            if (Physics.Linecast(lookPosition, transform.position, out hitInfo, 1 << LayerMask.NameToLayer("Ground")))
                transform.position = hitInfo.point;
        }
    }
}

그리고는 Hierarchy의 Main Camera에 FollowCamera 스크립트를 추가합니다.

---------------------------------------------------------------

그런 다음 Main Camera를 선택하고 Inspector에서 Follow Camera의 Look Target속성에 Player [ 카메라로 따라갈 대상 ]을 설정합니다.

그리고는 Offset에 Y축의 값도 1.5로 변경을 진행해 주세요

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

클릭한 위치로 캐릭터를 이동시키는 처리를 합니다.

목적지로 이동하는 처리는 CharacterMove 스크립트를 사용하면 구현 가능하고,

사용자가 마우스로 클릭한 화면 위의 위치는 InputManager 스크립트의 함수로 가져올 수 있습니다.

3D화면 공간 내에서 클릭한 위치는 어디인지 어떻게 아는지는

RayCast함수를 사용해서 화면을 클릭한 위치에서 게임 내 3D 공간의 위치를 구합니다.

---------------------------------------------------------------

이번에도 ScriptsPlayerCtrl스크립트를 생성하여 코드를 작성 합니다.

using UnityEngine;

using System.Collection;

 

public class PlayerCtrl : MonoBehaviour {

    const float RayCastMaxDistance = 100.0f;

    InputManager inputManager;

 

    void Start()

    {

        inputManager = FindObjectOfType<InputManager>();

    }

    void Update()

    {

        Walking();

    }

 

    void Walking()

    {

        if (inputManager.Clicked())

        {

            Vector2 clickPos = inputManager.GetCursorPosition();

            Ray ray = Camera.main.ScreenPointToRay(clickPos);

            RaycastHit hitInfo;

            if (Physics.Raycast(ray, out hitInfo, RayCastMaxDistance, 1 << LayerMask.NameToLayer("Ground")))

            {

                SendMessage("SetDestination", hitInfo.point);

            }

        }

    }

}

마지막으로 이 스크립트를 Hierarchy의 캐릭터 오브젝트에 추가합니다.


주의해야 할 점!

캐릭터와 모든 것들을 전부 일단 지정을 해주셔야 할 것 같습니다.

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

먼저 GameObject메뉴의 Create Empty를 선택하여 빈 게임 오브젝트를 생성합니다.

[ Ctrl + Shift + N ] 이것을 눌러서 만들어도 됩니다.


그런 다음에 생성된 GameObject를 이름은 이렇게 'InputManager'로 변경을 해줍니다.

그리고 Assets에 있는 Scripts에 C#스크립트 파일을 만들고 이렇게 입력을 합니다.

using UnityEngine;
using System.Collections;

public class InputManager : MonoBehaviour {
    Vector2 slideStartPosition;
    Vector2 prevPosition;
    Vector2 delta = Vector2.zero;
    bool moved = false;

    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
            slideStartPosition = GetCursorPosition();

        if (Input.GetButton("Fire1")) {
            if (Vector2.Distance(slideStartPosition, GetCursorPosition()) >= (Screen.Width * 0.1f))
                moved = true;
        }

        if (!Input.GetButtonUp("Fire1") && !Input.GetButton("Fire1"))
            moved = false;

        if (moved)
            delta = GetCursorPosition() - prevPosition;
        else
            delta = Vector2.zero;

        prevPosition = GetCursorPosition();
    }

    public bool Clicked()
    {
        if (!moved && Input.GetButtonUp("Fire1"))
            return true;
        else
            return false;
    }

    public Vector2 GetDeltaPosition()
    {
        return delta;
    }
    public bool Moved()
    {
        return moved;
    }
    public Vector2 GetCursorPosition()
    {
        return Input.mousePosition;
    }
}

그런 다음에 InputManager 게임 오브젝트에 InputManager 스크립트를 추가합니다.

---------------------------------------------------------------

유니티에선 Input클래스를 이용해 사용자의 입력을 가져옵니다.

Input클래스는 여러 입력 장치등 입력을 기능 이름[ex) Fire1]에 할당해 입력 상태를 가져올 수 있습니다.

이렇게 하면 입력 장치별로 따로 코드를 작성하지 않아도 같은 입력을 불러옵니다.

버튼을 눌렀는가를 감지하기 위해서는 이렇게 합니다.

if (Input.GetButtonDown("Fire1"))

{

//내용

}

조이스틱 같은 연속적인 값이 있는 입력일 때는 Input클래스의 GetAxis함수로 아날로그 값을 가져올 수 있다고 합니다.

[ 이것은 Edit -> Project Settings -> Input 를 순서대로 선택 / 그리고 Inspector에 표시되는 InputManager에서 설정 ]

 Horizontal 

 키보드의 좌우 방향키 또는 A와 D, 조이스틱의 가로 방향

 Vertical

 키보드의 상하 방향키 또는 W와 S, 조이스틱의 세로 방향

 Fire1

 마우스 좌 버튼, 키보드의 왼쪽 Ctrl, 조이스틱 버튼 0

 Fire2

 마우스 우 버튼, 키보드의 왼쪽 Alt, 조이스틱 버튼 1

 Jump

 키보드의 Space Bar, 조이스틱 버튼 3

이것은 기본 적인 셋팅입니다.

---------------------------------------------------------------

여기 부턴 Input 클래스의 주요 함수 입니다.

 GetButtonDown 

 버튼을 누르면 true, 그 외에는 false를 반환 즉, 버튼을 누른 프레임만 true를 반환

 GetButtonUp

 눌렀던 버튼이 다시 올라오면 true, 그 외에는 false를 반환 즉, 눌렀던 버튼이 다시 올라온 프레임만 true를 반환

 GetButton

 버튼을 누른 동안은 true, 눌렀던 버튼이 다시 올라오면 false를 반환

---------------------------------------------------------------

스틱 계의의 주요 함수 입니다.

GetAxis : 스틱의 기울기를 -1에서 1사이 값으로 나타내서 가져온다.

인수로는 Horezontal이란 Vertical을 많이 사용한다.

---------------------------------------------------------------

마우스 커서의 위친 Input클래스의 mousePosition속성으로 가져올 수 있습니다.

화면 왼쪽 아래 모서리가 (0, 0)이고 오른쪽 위 모서리가 ('화면의 세로 픽셀 수' -1, '화면의 가로 픽셀 수' -1)이 된다고 합니다.

Vector2 cursor = Input.mousePosition;

---------------------------------------------------------------

키보드 입력을 직접 가져오는 것도 가능하다고 합니다.

if (Input.GetKeydown(KeyCode.Esccap))

{ //ESC를 눌렀다.


블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

그럼 이제 재생 버튼을 눌러 보자!

(으아아앙 사진이 10M가 넘어가 버렸어요!! 흐앙! 그래서 사진을 못올리네요!)

그래서 다른 사진으로 설명을 대체합니다!! :(

요기에 Arrived의 체크는 도착했다라는 것입니다.

Destination의 값을 수정해 주고 Arrived의 체크상태를 풀어준다면 캐릭터가 이동을 합니다.

물론 위에 상단에 재생을 누루고 요로케 된다면! 그때 해주시면 됩니다!

만약 해당 캐릭터를 사용하지 못할 경우 그냥 도형으로 테스트해도 될 것입니다!

(아님 담에 유니티에 3D 모델을 임포트 하는 방법에 대하여 올리도록 하겠습니다.)

섬세를 눌러보세요!

블로그 이미지

이사가는 사람

안녕하세요 블로그를 옮기려고 생각하고 있습니다. 해당 블로그는 폐기하고 다음 다른 블로그에서 뵙도록 하겠습니다. 감사합니다!

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.