Warg모델을 화면으로 드래그를 하여 불러옵니다.

위치는 상관 없습니다. 잘 보이기만 하면 됩니다.


캐릭터와 같이 Warg에도 컴포넌트와 스크립트를 추가 합니다.

먼저 Character Controller를 위와 같이 셋팅하여 설정을 합니다.

그리고는 Character Move와 Character Status를 불러와서 다음과 같이 설정을 합니다.


그렇게 늑대를 프리팹화 합니다.


잊지말고 드래곤도 프리팹화를 하기 위한 셋팅을 합니다.

위와 같은 셋팅이 완료가 된다면 늑대하고 드래곤을 프리팹화 합니다.


블로그 이미지

이사가는 사람

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

,

프리펩이라는 것이 무엇인지를 먼저 생각을 해야 한다고 생각을 합니다.

제가 책을 보고 생각한 프리팹은 기본 셋팅이라는 것입니다.

기본값을 설정을 하는 것입니다.

그리고 모든 복제된 변형된 모든 오브젝트는 프리팹을 통한 기본 세팅을 진행을 합니다.

이렇게 Assets에 Prefabs라는 폴더를 생성합니다.

그리고 Hierarchy에 있는 캐릭터를 프리팹에 옮깁니다.

그리고 프리팹을 화면으로 옮겨서 꺼낸 후에 잘 되었는지 확인을 합니다.^^

블로그 이미지

이사가는 사람

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

,

나중에 구현할 공격과 에니메이션에 대비를 하여 Player와 적의 체력등등의 정보를 저장하는 CharacterStatus 스크립트를 작성하여 캐릭터와 적에게 적용을 합니다.

마찬가지로 Assets에 있는 Scripts폴더에 새로이 하나 CharacterStatus를 생성합니다.

using UnityEngine;
using System.Collections;

public class CharacterStatus : MonoBehaviour {
    public int HP = 100;
    public int MaxHP = 100;

    public int Power = 10;

    public GameObject lastAttackTarget = null;

    public string characterName = "Player";

    public bool attacking = false;
    public bool died = false;
}

변수만 존재하는 간단한 스크립트입니다.

나중에 필요한 변수도 미리 정의를 했으니 그 점을 알아 주시기를 바랍니다.

그럼 간단하게 변수 이름을 알려줘야 겠죠??

 HP 

 체력

 Max HP

 최대 체력

 lastAttackTarget

 마지막에 공격한 적

 characterName

 캐릭터 이름

 attacking

 공격 중임을 나타내는 플래그

 died

 사망을 나타내는 플래그

 Power

 공격력

CharacterStatus 클래스의 변수

그리고 캐릭터에 추가하면 끝입니다!!!


그럼 이만!

블로그 이미지

이사가는 사람

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

,

같은 프레임 내에서 스크립트의 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를 눌렀다.


블로그 이미지

이사가는 사람

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

,