20160414 Unity 스터디
Unity3D.VR 2016. 4. 14. 15:16http://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 탭에서 설정가능.