[Unity] 비주얼 패러디를 통해 대상밀기

15506 단어 UnityC#

입문


화면에서 한꺼번에 대량의 대상을 꺼낼 때 Instantiate () 와 Destroy () 를 사용하여 실례적인 생성과 폐기를 하면 무거울 것 같아서 이런 상황에서 어느 정도의 대상을 만들어서 사용하는 것이 가장 좋다.
그래서 이번에 대상 수영장의 개요를 알고 실제로 해봤어요.

코드 정보


Bullet 풀 탑재 이니시에이터


발사기에 관한 스크립트입니다.
시작 함수의 배열에 Bullet 인스턴스를 저장합니다.
겸사겸사 발사기의 하위 대상으로
이번에는 10프레임에서 원형 탄막을 치는 느낌으로 탄막의 탄알이 144방향으로 발사됐다.
//총알 실례에서 스크립트 가져오기
에서 기술한 장면은 다음 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 둘레를 분석하도록 한다
이번 Instantiate() 대신
Luncher_ofpool.cs
    public GameObject pool_Bullet;
    public float _Velocity_0, Degree, Angle_Split;

    //とりあえずの配列数144*16
    GameObject[] Bullet = new GameObject[2304];

    float _theta, WaitFrame = 0;
    float PI = Mathf.PI;

    private void Start() {
        //配列に格納して子オブジェクトに
        for (int i = 0; i < 1296; i++) {
            Bullet[i] = (GameObject)Instantiate(pool_Bullet);
            Bullet[i].transform.parent = gameObject.transform;
            Bullet[i].SetActive(false);
        }
    }

    void Update() {
        WaitFrame++;
        //10フレームに1回円形弾幕
        if (WaitFrame > 10) {
            for (int i = 0; i <= (Angle_Split - 1); i++) {
                //n-way弾流用。360度方向にだす
                float AngleRange = PI * (Degree / 180);

                //弾インスタンスに渡す角度の計算
                _theta = (AngleRange / (Angle_Split - 1)) * i + 0.5f * (PI - AngleRange);

                //弾インスタンスからスクリプト取得
                GameObject Bullet_obj = poolBullet(); 
                BulletSc2 bullet_cs = Bullet_obj.GetComponent<BulletSc2>();

                //アクティブになったフラッグ
                bullet_cs.Bulletmove_flag = true;

                //角度と初速に加えて、ランチャーの座標も渡す(消滅までの距離測るため)
                bullet_cs.Lpos = transform.position;
                bullet_cs.theta = _theta;
                bullet_cs.Velocity_0 = _Velocity_0;
            }
            WaitFrame = 0;
        }
    }

poolBullet 함수


poolBullet 함수입니다.게임오브젝트형?말할 수 있을지 모르겠지만 되돌아오는 값으로 Game Object를 되돌려줍니다.
for 문장에서 풀에 있는 대상의 활동, 비활동을 확인하고 비활동 대상이 있으면 활성화하고 되돌려줍니다.
Obj_아니요 변수에 관해서는 순환을 끝내기 전에 얼마나 많은 대상을 활성화했는지 기록합니다."-1"을 넣는 것은 아래의if문장에 들어가기 위해서입니다.
if 문장이 Obj_"-1"이 "아니오"이면 비활성 개체를 찾지 못하고 순환을 통과합니다.이것은 Instantiate () 에서 부족한 탄환 인스턴스를 생성하여 배열에 저장합니다.
poolBullet()
    GameObject poolBullet() {
        //プールから使うオブジェクトのナンバー。初期化はー1
        int Obj_No = -1;
        //プールの中のオブジェクトの数
        int Obj_Cnt = transform.childCount;

        //for文で調べる非アクティブのオブジェクトがあれば抜ける
        for (int i = 0; i < Obj_Cnt; i++) {
            if (!Bullet[i].activeSelf) {
                Obj_No = i;
                Bullet[Obj_No].SetActive(true);
                break;
            }
        }

        //プール中のオブジェクト全てアクティブなら、増やして新しく配列に入れる
        if (Obj_No == -1) {
            Obj_No = Obj_Cnt;
            Bullet[Obj_No] = (GameObject)Instantiate(pool_Bullet);
            Bullet[Obj_No].transform.parent = gameObject.transform;
        }

        //使うオブジェクトを返す
        return Bullet[Obj_No];
    }

총알의 각본


Instantiate ()에서 생성될 때 Start 함수를 호출하기 때문에 거기에서 가속도를 제시했지만 이번 방법이라면 매번 Start 함수를 호출할 수 없기 때문에 지금까지 가속도를 준 처리는 Update 함수로 이동했습니다.활성화 시 한 번만 입장합니다.
Object_가짜 함수 정보
이번 탄례의 삭제(비활동) 조건은 발사기와의 거리다.또 비활동 전에 발사기의 위치에서 다시 총알을 발사하기 위해 좌표도 복원했다.
참고로 On Enable (), On Disable () 와 같은 활동, 비활동 시 들어가는 함수가 있기 때문에 거기를 사용하고 싶은데 잘 안 돼서 이 모양이 됐어요.
BulletSc2.cs
    public float Velocity_0, theta;
    public bool Bulletmove_flag;
    public Vector2 Lpos;

    Rigidbody2D rid2d;

    private void Start() {
        //Rigidbody取得
        rid2d = GetComponent<Rigidbody2D>();
    }

    private void Update() {
        //アクティブになった時の弾の動き
        if (Bulletmove_flag) {
            //角度を考慮して弾の速度計算
            Vector2 bulletV = rid2d.velocity;
            bulletV.x = Velocity_0 * Mathf.Cos(theta);
            bulletV.y = Velocity_0 * Mathf.Sin(theta);
            rid2d.velocity = bulletV;
            Bulletmove_flag = false;
        }


        //弾の座標とランチャーから送られてきた座標で距離を計算
        Vector2 Bpos = transform.position;
        float Distance_to_Luncher = Vector2.Distance(Bpos, Lpos);

        //今回はランチャーからの距離が消滅の条件
        if (Distance_to_Luncher >= 50) Object_false();
    }

    //非アクティブになる前に座標をリセット
    void Object_false() {
        transform.position = Lpos;
        gameObject.SetActive(false);
    }

실행 결과


이번 대상 수영장은 원형 탄막입니다.
나는 게임 창의 Status 디스플레이에서 FPS를 보았다.
높이 63FPS ~ 낮음 42FPS 정도.

완전히 같은 탄막에
Instantiate() 및 Destroy()를 사용하여 생성 및 제거를 시도합니다.
대상 수영장에 비해 60FPS를 넘지 않고 50FPS를 차단하는 경우가 조금 많다.

총결산


이런 탄막계의 물건에 대한 대상 수영권이 없어서 만들어 봤어요.쓸모 있는 데가 있으면 좋겠어요.
처음으로 대상 수영장을 만들어 보았지만 형용할 수 없게 되었다.
나는 사용하지 않은 것보다 처리하는 것이 더 극적인 차이가 있을 것이라고 생각했지만, 비교 방법이 좋지 않을 가능성도 있었다.그나저나 현재 규격에 사용할 수 있는 총알의 실례를 찾기 위해 위에서 순서대로 찾기 때문에 거기서 어떻게 하면 더 가벼워질 수 있겠는가.
이번에는 배열에서 (위) 총알을 실례화하여 수영장을 만들었지만, C#는 List가 되는 기능이 있는 것 같다. 읽어보면 저쪽을 사용해서 순환 처리를 하지 않으면 수영장에서도 사용할 수 있는 대상을 찾을 수 있다는 느낌을 받을 수 있다.개량의 여지가 있다.

좋은 웹페이지 즐겨찾기