유니티 3D 2강
유니티3D 2강
벡터 행렬 삼각함수(각도,거리)는 이해 할 필요가 있음
금일 유니티 소스
http://freebox.myqnapcloud.com:8080/share.cgi?ssid=0bHkyek 유니티 세이더와 이펙트 오탈자 정리
http://kazoh.blog.me/220065605491
==[ 오브젝트간 충돌 설정 ]==
리지드 바디가 적용된 오브젝트를 선택하고 레이어를 적용해준다
menu -> project setting -> physics 피직스 매니져에서 서로 충돌하지 않을 레이어의 체크를 꺼준다
해상도 설정 => 1280*800
바주카 위치
카메라 시야 조정하기
near = 바라볼수 있는 가장 가까운 거리
far = 최대 바라 볼 수 있는 거리
field of view = 시야 (좌우)폭 (원근감의 느낌이 달라짐)
view port rect =
W 1 = WIDTH = 100%
w 1 h1 = 100% 가로 세로 꽉 채워서 렌더링 한다.
Culling Mask -> 선택된 레이어만 안보이게 함
animation = 레거시 방식
animator = 매카님 방식
적의 인공지능을 위한 유한상태기계의 이해 및 각 상태 기획 - 교재 참조
애니메이션을 복사하기 -> 애미네이션 선택 CTRL + D 복사후
<- 애니메이션의 이름 바꾸기
애니메이션 속성
once = 한번만진행
loop = 반복진행
ping pong = 진행방향 리버스 방향 반복
clamp forever = 애니매이션 끝 부분에서 멈춰 있음
애니메이션 키 압축
쉬프트 + 컨트롤 + 스페이스바 함수 정보 보기
총알발사
======[ FireMag ]========================================
using UnityEngine; using System.Collections; public class FireMag : MonoBehaviour { public GameObject ShotBall; public float speed; public GameObject ShotPos; void Update() { // 마우스 왼쪽 버튼을 눌렀거나 왼쪽 콘트롤키를 눌렀을때 // menu -> project setteing -> input 에서 확인 if (Input.GetButtonDown("Fire1") == true) { // 총알 생성 GameObject shotB = Instantiate(ShotBall); shotB.transform.position = ShotPos.transform.position; // 가속도를 사용하여 총알 발사 // 총알 프리팹 리지드 바디 참조 Rigidbody myShotRB = shotB.GetComponent<Rigidbody>(); // velocity = 방향 * 속도 * 시간 // Camera.main.transform.forward = 카메라의 정면 시점 myShotRB.velocity = Camera.main.transform.forward * speed; //#리지드바디에는 폭파시 빚금을 내는 함수가 있다. } } }몬스터 상태 설정======[ Spider ]========================================using UnityEngine; using System.Collections; public class Spider : MonoBehaviour { // enum 코드의 효율성을 주고 싶을때. 문자로 표시 할 수 있음 가독성을 높일 수 있음. public enum SpiderState { // 첫번째 변수에 0을 대입하면 순차적으로 Move = 1, Attack = 2, Damage = 3 순으로 올라간다 Idle = 0, Move, Attack, Damage, Dead } // 애니메이션 컴포넌트 참조 할 변수 Animation monAni = null; GameObject target = null; //대기 시간 변수 float interVal = 0; //const 를 선언하면 값을 변할 수 없게 한다.const float attackRange = 3; //공격범위 const float attackTime = 2; //공격시간int hp = 5; // enum 참조 // enum SpiderState를 변수 state에 대입 // 무브를 실행 하려면 = SpiderState state = SpiderState.Move; SpiderState state = SpiderState.Idle; //상태처리 함수 생성 void Idle() // 대기 { // monAni.Play("idle"); //타이머 설정 interVal += Time.deltaTime; //interVal변수에 현재 시간의 흐름(float)을 더해준다. if (interVal > attackRange) //2초 지난뒤 실행 { //2초 지난뒤 SpiderState.Move 호출 state = SpiderState.Move; interVal = 0; // 재활용을 위해 초기화 시킨다 } } void Move() { // 거리값 계간 함수 Vector3.Distance(a의 위치 , b의 위치); float distance = Vector3.Distance(target.transform.position, this.transform.position); //거리값으로 공격 호출 if (distance < attackRange) { state = SpiderState.Attack; // 인터벌 어택타임 3초로 대입하여 플레이어와 가까워 졌을때 바로 공격 interVal = attackRange; } else { // 이동 // 타겟 - 자기 자신 ( 방향 설정 ) * 이동 공식 외울것. // dir에 플레이어의 위지를 대입하고 자기 자신의 위치값을 뺀다. Vector3 dir = target.transform.position - this.transform.position; //normalized = ??? 벡터를 만들기 위해 실행 한 함수. dir.Normalize(); dir.y = 0; //이동 코드 = 자기 자신의 위치 += 이동방향 * 속도 * 시간 this.transform.position += dir * 5 * Time.deltaTime; // 플레이어의 회전 방향 대입 Quaternion to = Quaternion.LookRotation(dir); // 회전 Lerp() = 시간에 따라 부드러운 처리 사용 // Quaternion.Lerp(자기자신의 회전 방향(값), 바라보고 싶은 방향(값 플레이어),시간(회전할 시간 각) ); // 10 * Time.deltaTime 매 프레임마다 각을 계산 //this.transform.rotation = Quaternion.Lerp(this.transform.rotation,to, 10 * Time.deltaTime); this.transform.rotation = Quaternion.Lerp(this.transform.rotation, to, 0.05f); monAni.Play("walk"); // 이동 애니메이션 호출 } } void Attack() // 공격 { interVal += Time.deltaTime; // 2초에 한번 공격 if (interVal > attackTime) { monAni.Play("attack"); // 공격 애메니이션 호출 // PlayQueued : attack(이전 attack은 루프가 되면 안됨) 애니메이션 뒤에 idle 애니메이션을 추가 함. monAni.PlayQueued("idle"); interVal = 0; } //플레이어와 거리가 멀어지면 다시 idel 호출 if (Vector3.Distance(target.transform.position, this.transform.position) > attackRange) { state = SpiderState.Idle; interVal = 0; } } void Damage() // 데미지 { monAni.Play("damage"); monAni.PlayQueued("idle"); interVal = 0; state = SpiderState.Idle; hp--; if (hp <= 0) { state = SpiderState.Dead; } } void Dead() // 죽음 { monAni.Play("death"); Destroy(this.gameObject, 0.5f); } void OnCollisionEnter(Collision col) {// 레이어 인덱스는 문자로 넣어도 숫자로 반환된다.// 레이어 인덱스는 int형 변수에 대입된다 int layerIndex = col.gameObject.layer; //레이어 마스크로 부딪히는 오브젝트 이름 가져옴 if (layerIndex == LayerMask.NameToLayer("ball")) { state = SpiderState.Damage; } /* if (col.gameObject.tag == "bullet") { state = SpiderState.Damage; } */} void Start() { // 매카닉(new) 애니메이션 방식은 Animator 레거시(old) 방식은 Animation // 몬스터 애니메이션에서 idle 애니메이션을 플레이 시킨다. 레거시 방식은 초기 루프가 기본이 아니다. monAni = GetComponent<Animation>(); // 태그로 플레이어 검색 target = GameObject.FindGameObjectWithTag("myPlayer"); } void Update() { // enum 의 메소드 호출 방법 switch (state) { case SpiderState.Idle: { Idle(); } break; case SpiderState.Move: { Move(); } break; case SpiderState.Attack: { Attack(); } break; case SpiderState.Damage: { Damage(); } break; case SpiderState.Dead: { Dead(); } break; } } }몬스터 젠======[ MonsterGen ]========================================
using UnityEngine; using System.Collections; public class MonsterGen : MonoBehaviour { float randX; float randZ; Vector3 genPos; public GameObject monster; void Start() { StartCoroutine(Factoy()); } // 몬스터 생성 IEnumerator Factoy() { while (true) { randX = Random.Range(20, -20); randZ = Random.Range(20, -20); genPos = new Vector3(randX, 0, randZ); yield return new WaitForSeconds(3); GameObject mon = Instantiate(monster); mon.transform.position = genPos; } } }
댓글
댓글 쓰기