유니티 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;            
            
        }
 
 
    }
 
}

댓글

이 블로그의 인기 게시물

날짜 시간 시간차 시간 계산 하기

코루틴에서 CallBack 함수 적용하기

C++ 언어 퍼센트 구하는 방법 / 기본 언어 퍼센트 구하는 방법