Clolent

FPS 발사 위치 1번

더미 오브젝트를 하나 카메라 오른쪽 아래에 하나를 만들어 놓고 그 위치를 통해서 발사하는 방법


FPS 발사 위치 2번

코드 적인 방법으로 해결하는 방법 !

그냥 Vector3.right 등으로 그냥 해버리면 상수값이기때문에 운좋게 z축을 바라보던게 아니면, 바라보는 방향에 따라 발사위치가 바뀐다. 그렇다면 어떻게 해야하는가.


transform.right 이런 것이 있다!  내 기준 오른쪽을 돌려준다.  정리 FireScript


    public Transform cameraTransform;

    public Transform create;

    public GameObject fireObject;

    public float fowardPower = 20.0f;

    public float upPower = 5.0f;


// Update is called once per frame

void Update () {

        

   if(Input.GetButtonDown("Fire1"))

        {

            GameObject obj = Instantiate(fireObject) as GameObject;

            obj.transform.position = transform.position + cameraTransform.right;

        //  obj.transform.position = create.position;


            obj.GetComponent<Rigidbody>().velocity = (cameraTransform.forward * fowardPower)

                + (Vector3.up * upPower);

        }

}



Local 좌표계와 World 좌표계

부모가 따로 없는 오브젝트들은 Local = World 이다. 세상이 부모인 셈, 하지만 부모가있는 오브젝트들은

세계를 기준으로한 그 위치가 있을 것이고, 또 부모를 기준으로한 상대적인 좌표가 있을 것이다. 부모를 기준으로한

상대적인 위치를 Local 좌표 라고 한다.드 적인 방법으로 해결하는 방법 !


※ 플레이 단축키 Local 좌표계와 World 좌표계


※ 플레이 도중 변경된 값들을 저장하는 방법 : 노트필기 / 스크린샷 / 유니티 상에서 alt + Screen


※ 플레이 도중 변경된 값들을 저장하는 방법 : 변경된애를 프로젝트로 빼버려서 프리팹을 만들어버린다.

너무많은 정보를 바꿧을 때만 사용하도록 하자. 그리고 백업햇던건 링크끊고 삭제까지 깔끔하게


※ 체크 박스가 없는 컴퍼넌트 : 업데이트 함수가 없는 컴퍼넌트 들이라고 생각하면 된다.


※ 유니티에서의 Mass = 부딪혔을 때의 무게 

※ 애니메이션 상에서 Position 에 뭔가 조작을 가하면 코드상에서의 Position 에 대한 어떠한 조정을 모두 무시한다. 
따라서 더미 오브젝트를 부모로 만들고 이 더미오브젝트에 애니메이션을 가하는 방식으로 해결할수 있다.

※ 총을 쏘고난 자국이나 폭발자국 등을 데칼 이라고 칭한다.

--------------------------------------------------------------------------------------------------------------------------------------


Rigidbody Issue

※ 유니티에서의 Mass = 부딪혔을 때의 무게 


※ Is Kinematic : 모든 물리법칙 등을 멈춤 다시 해제해주면 물리법칙을 준다. 

예를 들어서, 회전하다가 이걸 켰다 꺼면 회전이 멈추고 중령만 바다서 떨어진다.


※ Collision Deection : 충돌 체크를 한다 빠른 투사체 같은걸 쏜 경우 가끔 충돌을 무시한다. 프레임과 프레임 사이르 통과해버릴수 있기 때문 

discrete 그냥현위치 기준 충돌 판단

continuous 멈춰있는 애 기준으로 움직이는애의 미래르 보고 중간값으로 충돌여부판단.

continuous Dynaic 움직이는 애와 움지이는 애의 충돌을 체크 

Discrete 로 두고, 컬라이더를 두껍게 해서 이러한 오류를 막는 방법도있다 ! 


※ Freeze 어쩌고 : 아무리 힘을 가해도 해당 축으로 움직이지 않는다.


--------------------------------------------------------------------------------------------------------------------------------------


Z 파이팅

FPS 게임에서 벽에 같은 위치에 총을 쏠때 새로운 자국이 기존자국위에 생기기도 하고 안생기기도한다. 이러한 이슈를 Z 파이팅 이라고 한다. 왜 일어나는가 ? 


어떠한 배경이나, 보이는 것들은 가까울수록 0에 가까운, 멀수록 1에 가까운 숫자가 Z 버퍼에 기입된다. 이것으로 이제 겹치는 부분은 안그려서 코스트르 줄이거나 한다. 가까운 부분 ( 0에 가까운 부분 ) 부터 그려가면서, 높은 숫자부분을 그리는데 이미 그 위치에 낮은숫자 가 이미 그려져 있다면, 그부분은 그리지 않는다. 이때 이걸 판단하는 것을 Depth Test 혹은 Z Test 라고 하는데 이때 만약 같은 값을 가지는

두 그림을 그리려고 한다면, 먼저 온놈이 그려져버린다. 이러한 케이스를 Z 파이팅 이라고 한다.


기보적으로 이 그리는기법은 0에 가까울수록 디테일하고 멀수록 대충(?) 하게 되는데, 이 디테일 한 부분을 살리기 위해 카메라를 조금 떨어진 부분에서부터 시작되게 된다. 이 길이가 바로 Clipping Planes 이다.


요즘은 거꾸로 멀리있는 곳을 디테이라게 그리느, 즉 거꾸로 뒤집어서 사용하고있다고한다 대표적인 예로 GTA 가 있다.


--------------------------------------------------------------------------------------------------------------------------------------


코루틴과 이누머레이터 ? ( Coroutine And IEnumerator ) 

코루틴을 불러낸다는 것은 하나의 멀티 스레드를 생성한다는 것으로 이해해도 될것같다. 


using UnityEngine;

using System.Collections;


public class Fire_Sryuriken : MonoBehaviour {


    public Transform cameraTransform;

    public Transform create;

    public GameObject fireObject;

    Rigidbody rid;

    public float fowardPower = 50.0f;


    Vector3 vec_rot;

    bool cooltime = true;

    // Update is called once per frame

    void Update()

    {


        if (Input.GetButtonDown("Fire1") && cooltime)

        {

            cooltime = false;

            StartCoroutine(TripleShot());

        }

        else if( Input.GetButtonDown("Fire2") && cooltime)

        {

            cooltime = false;

            StartCoroutine(SpreadShot());

        }

    }


    IEnumerator TripleShot()

    {

        for (int i = 0; i < 3; ++i)

        {

            GameObject obj = Instantiate(fireObject) as GameObject;

            //   obj.transform.position = transform.position + cameraTransform.right;

            obj.transform.position = create.position;

            obj.GetComponent<Rigidbody>().AddTorque(Vector3.zero);

            obj.GetComponent<Rigidbody>().velocity = (cameraTransform.forward * fowardPower);

            yield return new WaitForSeconds(0.2f);

        }

        yield return new WaitForSeconds(0.7f);

        cooltime = true;

    }

    IEnumerator SpreadShot()

    {

        float rot = 0;

            GameObject obj = Instantiate(fireObject) as GameObject;

            //   obj.transform.position = transform.position + cameraTransform.right;

            obj.transform.position = create.position - create.right * -1 * rot ;

            obj.GetComponent<Rigidbody>().AddTorque(Vector3.zero);

            obj.GetComponent<Rigidbody>().velocity = (cameraTransform.forward * fowardPower);

            rot += 10;


        GameObject obj2 = Instantiate(fireObject) as GameObject;

        // 2  obj.transform.position = transform.position + cameraTransform.right;

        obj2.transform.position = create.position - create.right * -1 * rot;

        obj2.GetComponent<Rigidbody>().AddTorque(Vector3.zero);

        obj2.GetComponent<Rigidbody>().velocity = (cameraTransform.forward * fowardPower);

        rot += 10;


        GameObject obj3 = Instantiate(fireObject) as GameObject;

        // 2  obj.transform.position = transform.position + cameraTransform.right;

        obj3.transform.position = create.position - create.right * -1 * rot;

        obj3.GetComponent<Rigidbody>().AddTorque(Vector3.zero);

        obj3.GetComponent<Rigidbody>().velocity = (cameraTransform.forward * fowardPower);


        yield return new WaitForSeconds(1);


        cooltime = true;

    }

}





댓글 로드 중…

블로그 정보

Clolent - 커피물조절달인

최근에 게시된 글