유니티/실습

주말 숙제 - FPS+TD - 1 - 기본 케릭터

파란색까마귀 2022. 2. 13. 23:08

2016. 4. 8. 10:12

https://blog.naver.com/nagne2011/220677638921

 

 

일단 FPS의 기본 바탕이 되는 케릭터 생성후,

 

 

 

UI카메라를 생성해서 크로스바(cross bar)를 만들어 준다음

 

 

 

 

합쳐진 화면은 이렇게 나온다

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
void Rebound()
    {
        if (aimCube [0].transform.localPosition.y < 2.5f) 
        {
        aimCube[0].transform.Translate(0, _boundPower, 0);    //상
        aimCube[1].transform.Translate(-_boundPower,00);    //좌
        aimCube[2].transform.Translate(_boundPower,00);    //우
        aimCube[3].transform.Translate(0-_boundPower, 0);    //하
        }
    }
cs

 

매번 발사시 위 함수를 실행하도록 설정.

반동파워만큼 크로스바가 벌어진다

 

계속 벌어져있으면 안되니까

 

1
2
3
4
5
6
7
if (aimCube [0].transform.localPosition.y > 0.5f) 
        {
            aimCube[0].transform.Translate(0-0.01f, 0);    //상
            aimCube[1].transform.Translate(0.01f,00);    //좌
            aimCube[2].transform.Translate(-0.01f,00);    //우
            aimCube[3].transform.Translate(00.01f, 0);    //하
        }
cs

 

요렇게 또 줄여주는 함수도 첨가.

 

 

이번 게임에서 사격은 RayCast로 처리하기로 했다

즉, 클릭시마다 RayCast를 발사해서 충돌된 물체에 대해 판정을 하는것.

 

단 총은 역시 반동과 흔들림이 있어야 하니까 크로스바에 맞춰 오차각을 설정해준다

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    void OnFire()
    {
        ReboundY.SendMessage ("ReboundY", _reboundPower, SendMessageOptions.DontRequireReceiver);
        errorAngle += _boundPower * 10.0f;
        Quaternion rotFire = Quaternion.identity;
    
        float radRandomAngle = Random.Range (0, Mathf.PI * 2.0f);
 
        Vector3 rotVec = new Vector3 (Mathf.Cos (radRandomAngle), Mathf.Sin (radRandomAngle), 0.0f);
        Vector3 shotDir = Vector3.forward;
 
        Quaternion oneBBulRot = Quaternion.AngleAxis (Random.Range (0, errorAngle), rotVec);
 
        shotDir = oneBBulRot * shotDir;
        rotFire = Quaternion.LookRotation (shotDir) * _gun.transform.rotation;
 
 
        ray.origin = _gun.transform.position;
        ray.direction = shotDir;
 
        if(Physics.Raycast(ray, out hit, _range))
        {
            //충돌확인!!!
        }
 
        Rebound ();
 
        this._isFire = true;
 
        StartCoroutine (CoReadyFire());
            
    }
 
    IEnumerator CoReadyFire()
    {
        yield return new WaitForSeconds (1.0f / this.fireForSec);
        this._isFire = false;
    }
 
cs

 

 

발사 담당 함수는 이렇게 구성했다

오차각 erroAngle에 맞춰, 랜덤적으로 원뿔 방향으로 각도가 바뀐다

거기다 발사할때마다 반동에 맞춰 erroangle값이 증가하고, 발사를 멈추면 다시 줄어든다

즉, 일반 fps와 마찬가지로 연사시 맞추기가 어려워진다

 

 

728x90