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;
}
}