20160414 Unity 스터디

Unity3D.VR 2016. 4. 14. 15:16

http://unity3d.com/kr/learn/tutorials/projects/survival-shooter/player-character?playlist=17144


# Animator Controller > Make Transition

# Animator Controller > Parameters


# tutorial대로 진행하고 Game씬에서 테스트 해보면 Idle과 Move 사이가 매끄럽게 연결되지 않는데 

transition 속성에 Has Exit Time을 체크 해제하면 부드럽게 동작한다.

영상 내에서의 구버전 유니티와 현재 디폴트값이 바뀐 것 같다.


Has Exit Time > 트랜지션 조건이 언제든지 효력을 발할 수 있게 할 것인지, 스테이트의 exit 시간 사이에만 효력을 발할 수 있게 할 것인지를 설정합니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    public float speed = 6f;
 
    Vector3 movement;
    Animator anim;
    Rigidbody playerRigidbody;
    int floorMask;
    float camRayLength = 100f;
 
    // 스크립트 실행에 상관없이 호출.
    // 참조설정에 유리함.
    void Awake()
    {
        // get reference
        floorMask = LayerMask.GetMask("Floor");
        anim = GetComponent<Animator>();
        playerRigidbody = GetComponent<Rigidbody>();
    }
 
    // Unity가 스크립트에서 자동으로 호출하는 함수.
    // 모든 Physics Update 를 유발한다. 물리효과와 함께 실행.
    // 일반 update는 렌더링과 함께 실행.
    void FixedUpdate()
    {
        // Raw는 -1,0,1의 값만을 가진다.
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
 
        Move(h, v);
        Turning();
        Animating(h, v);
    }
 
    void Move(float h, float v)
    {
        // 바닥과 수평
        movement.Set(h, 0f, v);
 
        // movement.normailized > Vector에서 두축을 동시에 움직일 경우 Vector의 길이가 달라지는 것을 방지.
        // Time.deltaiTime > update 호출 간격.
        movement = movement.normalized * speed * Time.deltaTime;
 
        playerRigidbody.MovePosition(transform.position + movement);
    }
 
    // 마우스의 위치로 캐릭터를 회전 시킨다.
    void Turning()
    {
        // Ray 생성. Camera에서 나오는 Ray다. 마우스 밑의 포인트를 찾는다.
        Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
 
        // Raycast의 정보를 저장하기 위한 구조체.
        RaycastHit floorHit;
        
        // 생성한 Ray를 실제로 쏜다.
        // out > 함수의 리턴 정보를 특정 변수에 집어넣는다.
        if(Physics.Raycast( camRay, out floorHit, camRayLength, floorMask))
        {
            // 마우스 아래 포인트와 캐릭터간의 거리
            Vector3 playerToMouse = floorHit.point - transform.position;
 
            // 캐릭터는 항상 수직으로 세워둠.
            playerToMouse.y = 0f;
 
            // Quaternion > 회전 정보를 저장함.
            Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
            playerRigidbody.MoveRotation(newRotation);
        }
    }
 
    void Animating(float h, float v)
    {
        // 축에 입력이 있나 없나.
        bool walking = h != 0f || v != 0f;
        anim.SetBool("IsWalking", walking);
 
        Debug.Log(walking);
    }
}
 
 
cs



# 시스템 성능에 따라 프레임 속도가 다르기 때문에 update() 호출 횟수가 달라질 수 있다. 

게임 상 캐릭터의 이동속도나 공격 속도 등 시스템 성능과 관계없이 항상 같은 값을 유지해야한다면 

Time.deltaTime값을 이용하는 것이 좋다.


http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=17494



# Collider에 Is Trigger 옵션을 주면 충돌에 물리적 반응은 없는 상태가 되는데 이것으로 근접 캐릭터의 공격범위를 설정할 수 있다.



# Nav Mesh > 간단한 AI를 위한 시스템

베이킹이라는 프로세스를 수행해서 레벨의 어떤 부분을 탐색할 수 있는지 지정.

길찾기.

Window > Navigation > Bake 탭에서 설정가능.




: