검색결과 리스트
글
실전 Unity3D Engine Programing 과정 6일차 (2013.07.29(월))
If(Input.GetAxis(“Vertical”) > 0.2f)
{
animation.CrossFade(“walk”);
}else
{
animation.CrossFade(“idle”);
}
}
animation.wrapMode = WrapMode.Loop;
animation["shoot"].wrapMode = WrapMode.Once;
animation["shoot"].layer = 1;
animation.Stop(); //무조건 한번 호출
}
Transform mixTransform;
mixTransform = transform.Find("root/upper_body/left_shoulder"); animation["wave_hand"].AddMixingTransform(mixTransform);
}
function PrintFloat (theValue : float) {
Debug.Log ("PrintFloat is called with a value of " + theValue);
}
최적화
퀄리티..
- Quality Settings.. 간단히 셋팅되어 있다.
- Blend Weights가 중요한 것이다.
## 애니메이션 실습을 해 보자
1 New Project > AnimationTest
2. 신 : test
3. 폴더: Scripts
4. AnimationExample 스크립트 만든다.
- 함수 추가
void EventTest(int i)
{
Debug.Log("Event Test Click~ "+i.ToString());
}
5. 큐브 추가
포지션은 0.0.0 . 검개 나온다.
6. 빛 추가
7. Menu > Windows > Andimation 창을 연다.
- Cube를 선택하고 한다.
8. 애니메이션 창에서 Cube를 선택하고 NewAnimation를 만든다.
9. 레코드 버튼을 누르고 값을 변환해 보고 실행해 본다.
10. 아까 만든 AnimationExample 스크립틀 추가 한다.
11. 애니메이션 창을 새로 열고 10번째 선택후 이벤트를 추가한다. (키 이벤트 삽입 버튼)
아래 이미지중 3번째 언더바가 키 이벤트 삽입 버튼 4번째 언더바가 해당 이벤트
12. 10번 프레임에서 이벤트를 클릭하면 아까지 만든 메소드명이 뜨고 그곳에 5값을 넣는다.
상기 이미지에서 4번째 언더바를 클릭하면 아래와 같은 창이 나온다.
13. 플레이 해 보면 콘솔에 다음 내용이 출력된다.
Event Test Click~ 5
UnityEngine.Debug:Log(Object)
AnimationExample:EventTest(Int32) (at Assets/Scripts/AnimationExample.cs:18)
이렇게 트랜스폼 중심으로 애니메이션과 스크립트를 만들 수 있다.
## 인터넷 유니티 사이트의 애니메이션 설명을 보자
http://docs.unity3d.com/Documentation/ScriptReference/index.html
## 캐릭터에 애니메이션
1. New Scen > test 2
2. 오늘자 KnightandBeetle 리소스 패키지를 추가한다.
- 기사
- 비틀이 있다.
3. 추가한 것에 Knight를 히어알키에 추가한다.
4. 스케일 값을 키우다. 10.10.10, 로테이트는 0.180.0 포지션은 0.0.-5
5. 라이트 추가
6. knight를 선택하고 menu > windodw > animation를 선택한다.
7. 각 동작별로 변경해 보며 플레이 해봐라. 애니메이션 클립 내용을 볼 수 있다.
- 32 프레임이다. 유니티는 .. 맥스랑 다르고, 언리얼은 60프레임 따라서 이창에서 확인해 보는게 좋다.
## 에니메이션과 손을 믹싱과 애드해 보자.
1. AnimationTest 스크립트 추가
using UnityEngine;
using System.Collections;
public class AnimationTest : MonoBehaviour {
public AnimationClip idleAnim;
public AnimationClip attackAnim;
public Transform mixingTransform;
// Use this for initialization
void Start () {
//기본적인것2개추가한다.
animation.wrapMode = WrapMode.Loop;
animation.Stop();
//mixing 해쉬맵에키값을넣으면스테이트값이나오고이것을믹싱한다.
animation[attackAnim.name].AddMixingTransform(mixingTransform);
//= animation["attack_01"] = AnimationState
animation.CrossFade(attackAnim.name);
}
}
5. kinght을 열어 보면 Bip001 Pelvis가 있고 이것을 knight 스크립트 믹싱 트랜스폼에 붙인다.
6. play해 본다.
7. 다른 것도 미싱트랜스폼에 넣어서 플래이 해봐라.
## Additive를 해보자
1. 스크립트를 수정하자. 이전에 코딩은 주석하고 추가한다.
using UnityEngine;
using System.Collections;
public class AnimationTest : MonoBehaviour {
public AnimationClip idleAnim;
public AnimationClip attackAnim;
public Transform mixingTransform;
// Use this for initialization
void Start () {
//기본적인것2개추가한다.
animation.wrapMode = WrapMode.Loop;
animation.Stop();
//mixing 해쉬맵에키값을넣으면스테이트값이나오고이것을믹싱한다.
//animation[attackAnim.name].AddMixingTransform(mixingTransform);
////= animation["attack_01"] = AnimationState
//animation.CrossFade(attackAnim.name);
//additive
animation[attackAnim.name].blendMode = AnimationBlendMode.Additive;
animation[attackAnim.name].layer = 10;
animation[attackAnim.name].weight = 1.0f;
animation[attackAnim.name].enabled = true;
animation[idleAnim.name].wrapMode = WrapMode.Loop;
animation.Play(idleAnim.name);
}
}
2. knight의 Idle anim을 move 리소스를 붙여 본다.
3. play해 보면.. 뛰면서 칼을 휘두른다.
layer와 weight을 바꿔 보면 다르게 동작이 될 것이다.
save secen , save project
## RPG를 만들어 보자.
사전지식
- 지형 만들고
- 캐릭터 세우고
- 캐릭터 이동하면서 애니메이션 된다.
1. New Project > RPG
2. 신저장 > main
13. 터레인에서 5번째 아이콘으로 나무를 심어 보자.
Add 버튼으로 추가한후 땅을 클릭해 보면 나무가 추가된다.
윈드로 설정할 수 있는데
다른 아이콘은 잔디도 심을 수 있다.
##
1. KnightandBeetle 패키지 추가
2. Knight 를 추가 하낟. 포시션 0, 0, -5, 로테이션 0, 180, 0, 스케일 10,10,10
3. Kinght 선택 menu > component > phisice > charactor controler
값은 center 0, 0.1, 0 각도 0.05, 높이 0.2
4. 스크립트 추가 Charictor_control
캐릭터와 카메라의 관계에서 카메라가 바라보는 위치에 따라서 캐릭터의 방향이 달라진다.
카메라중심으로 캐릭터를 움직여야 한다.
카메라에서부터 시작해야 한다.
카메라가 어디에 있냐. 카메라의 앞방향의 캐릭터의 앞뒤 방향.. 좌우가 ..
이것을 정확히 90를 구분하면 좌우가 된다.
백터는 방향을 갖는 두 힘이다. 이렇게 축이 된다.
카메라 포워드 (트랜스.포워드) 를 이용해서 캐릭터의 앞뒤, 직교하는 좌우를 구한다.
두백터를 더하면 캐릭터의 이동이 나온다.
시간에 따라 방향만 구하면 된다.
이것을 백터의 노멀라이즈라고 한다.
길이가 있는 것을 방향을 구해 준다.
void Move()
{
//카메라를구한다.
Transform cameraTransform = Camera.mainCamera.transform;
Vector3 forward = cameraTransform.TransformDirection(Vector3.forward);
forward = forward.normalized; //normal vector 1 vector
Vector3 right = new Vector3(forward.z, 0.0f, -forward.x);
//좌우백터.
//움직인다.
}
여기서
Vector3 right = new Vector3(forward.z, 0.0f, -forward.x); // 이것의 의미는
A.B = 0 일려면,
AxBx + AyBy = 0;
완성된 스크립트
public float RotateSpeed = 500.0f;
public float VerticalSpeed = 0.0f;
public float gravity = 9.8f;
private CharacterController charactercontroller;
private Vector3 MoveDirection = Vector3.zero;
private CollisionFlags collisionflags;
// Use this for initialization
void Start () {
charactercontroller = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update () {
Move();
}
void Move()
{
//카메라를구한다.
Transform cameraTransform = Camera.mainCamera.transform;
//좌우백터. 축을구한다.
Vector3 forward = cameraTransform.TransformDirection(Vector3.forward);
forward = forward.normalized; //normal vector 1 vector
//방향을바꿔져서직교이다.
Vector3 right = new Vector3(forward.z, 0.0f, -forward.x);
//움직인다.
float v = Input.GetAxisRaw("Vertical");
float h = Input.GetAxisRaw("Horizontal");
Vector3 targetVector = v * forward + h * right;
targetVector = targetVector.normalized; // normal vector
//벡터를 방향으로옮기기 위해서 방향을바꿔준다.
MoveDirection = Vector3.RotateTowards(MoveDirection, targetVector, RotateSpeed * Mathf.Deg2Rad * Time.deltaTime, 500.0f);
MoveDirection = MoveDirection.normalized;
Vector3 movementAmt = MoveDirection * MoveSpeed * Time.deltaTime;
collisionflags = charactercontroller.Move(movementAmt);
}
}
캐릭터를 캐릭터콘트롤을 쓰는게 좋다. 그렇지만 리니지바디보다는 무겁다.
캐릭터일 때만 사용해라..
collisionflags를 통해서 이 값이 어디에 있는지 알 수 있다.
캐릭터콘터롤러는 기본적으로 그라비티가 없기에 추가해 주어야 한다.
## 애니메이션 시켜 보자
1. 스크립트에 아래 내용을 추가한다.
//애니메이션클립을가져오기위해서퍼블릭으로했다.
public AnimationClip idleAnim;
public AnimationClip walkAnim;
public AnimationClip attackAnim;
public enum CharacterState
{
IDLE = 0,
WALK = 1,
ATTACK = 2,
SKILL = 3,
SIZE
}
상태를 바꿔가면서 애니메이션을 바꿔준다.
스크립트를 빼는 기준은 중복된 코드는 스크립트로 뺀다.
// Update is called once per frame
void Update () {
Move();
CheckState();
AnimationControl();
}
void AnimationControl()
{
//상태별로애니메이션을변경한다.
switch(state)
{
case CharacterState.IDLE:
animation.CrossFade(idleAnim.name);
break;
case CharacterState.WALK:
animation.CrossFade(walkAnim.name);
break;
case CharacterState.ATTACK:
break;
}
}
void CheckState()
{
//캐릭터콘트롤러는움직이면속도를알려준다
//길이 루크길이.
if(charactercontroller.velocity.sqrMagnitude > 0.1f)
{
//move
state = CharacterState.WALK;
} else
{
// stand
state = CharacterState.IDLE;
}
}
총..
using UnityEngine;
using System.Collections;
public class Charictor_control : MonoBehaviour {
public float MoveSpeed = 5.0f;
public float RotateSpeed = 500.0f;
public float VerticalSpeed = 0.0f;
public float gravity = 9.8f;
private CharacterController charactercontroller;
private Vector3 MoveDirection = Vector3.zero;
private CollisionFlags collisionflags;
//애니메이션클립을가져오기위해서퍼블릭으로했다.
public AnimationClip idleAnim;
public AnimationClip walkAnim;
public AnimationClip attackAnim;
public enum CharacterState
{
IDLE = 0,
WALK = 1,
ATTACK = 2,
SKILL = 3,
SIZE
}
private CharacterState state = CharacterState.IDLE;
// Use this for initialization
void Start () {
charactercontroller = GetComponent<CharacterController>();
animation.wrapMode = WrapMode.Loop;
animation.Stop();
}
// Update is called once per frame
void Update () {
Move();
CheckState();
AnimationControl();
}
void AnimationControl()
{
//상태별로애니메이션을변경한다.
switch(state)
{
case CharacterState.IDLE:
animation.CrossFade(idleAnim.name);
break;
case CharacterState.WALK:
animation.CrossFade(walkAnim.name);
break;
case CharacterState.ATTACK:
break;
}
}
void CheckState()
{
//캐릭터콘트롤러는움직이면속도를알려준다
//길이 루크길이.
if(charactercontroller.velocity.sqrMagnitude > 0.1f)
{
//move
state = CharacterState.WALK;
} else
{
// stand
state = CharacterState.IDLE;
}
}
void Move()
{
//카메라를구한다.
Transform cameraTransform = Camera.mainCamera.transform;
//좌우백터. 축을구한다.
Vector3 forward = cameraTransform.TransformDirection(Vector3.forward);
forward = forward.normalized; //normal vector 1 vector
//방향을바꿔져서직교이다.
Vector3 right = new Vector3(forward.z, 0.0f, -forward.x);
//움직인다.
float v = Input.GetAxisRaw("Vertical");
float h = Input.GetAxisRaw("Horizontal");
Vector3 targetVector = v * forward + h * right;
targetVector = targetVector.normalized; // normal vector
//벡터를 방향으로옮기기 위해서 방향을바꿔준다.
MoveDirection = Vector3.RotateTowards(MoveDirection, targetVector, RotateSpeed * Mathf.Deg2Rad * Time.deltaTime, 500.0f);
MoveDirection = MoveDirection.normalized;
Vector3 movementAmt = MoveDirection * MoveSpeed * Time.deltaTime;
collisionflags = charactercontroller.Move(movementAmt);
}
void OnGUI()
{
GUI.color = Color.red;
GUI.Label(new Rect(10,10,100,20),"state : "+state.ToString());
GUI.Label(new Rect(10,30,100,20),"flag : "+collisionflags.ToString());
}
}
오른쪽에 state는 방향이고 flag는 땅의 상태를 나타낸다.
캐릭터를 띄우기 위해서 카메라
카메라 값을 가져와서 캐릭터를 돌렸다.
'Unity3D' 카테고리의 다른 글
실전 Unity3D Engine Programing 과정 8일차 - 문서자료 (2) | 2013.07.31 |
---|---|
실전 Unity3D Engine Programing 과정 7일차 (0) | 2013.07.30 |
실전 Unity3D Engine Programing 과정 5일차 (0) | 2013.07.26 |
실전 Unity3D Engine Programing 과정 4일차 (0) | 2013.07.25 |
실전 Unity3D Engine Programing 과정 3일차 (0) | 2013.07.24 |
RECENT COMMENT