Cz_mirror Game開発備忘録

週末にUnity でゲーム開発をしています。ゲーム開発を通じて得た情報の備忘録として活用するブログになります。

【Unity】敵機捕獲後の自機への追従処理(グラディウスのオプションのようなイメージ)

 

Captulionでは敵機を捕獲することができますが、捕獲した敵機を自機へ追尾させるための処理についてまとめてみました。

f:id:godhandevilleg:20180212131800p:plain

追尾のイメージ

Captulionで敵機を捕獲すると以下の動画のように自機を追尾するようになります。

IMG_3184.TRIM from Kazushige Mori on Vimeo.

 

敵機の追尾処理について

捕獲した敵機をグラディウスというゲームにでてくるオプションのような動きをさせたかったので、検索してみたところ、とても参考になるgitを見つけましたので、そちらを参考にさせていただき調整することにしました。

 

github.com

 

追尾処理のカスタマイズ

Captulionでは上記の追尾処理を3D用にカスタマイズしています。以下はカスタマイズしたソースコードになります。(参考になったら幸いです。)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class FollowersController : MonoBehaviour {
    public float controlGainP = 1f;
    public float controlGainD = 1f;
    public GameObject player;
    private GameObject _enemy//instance
    private static List<GameObject_followers = new List<GameObject>();
    private List<GameObject_tmp_Followers = new List<GameObject>();
    private float followerVel = 5f;
    public float followerDistance = 100f;
    public int maxFollowers = 0;

    private GameObject[] slaves;
    private static List<GameObjecttmp_slaves;

    private GameController gameController;

    public void resetFollowers() {
        slaves = GameObject.FindGameObjectsWithTag ("Slave");
        maxFollowers = slaves.Length;

        _tmp_Followers = new List<GameObject> ();
        for (int i=0i < slaves.Length;i++) {
            _tmp_Followers.Add(slaves[i]);
        }

        _followers = _tmp_Followers;
    }

    void Start () {
        GameObject gameControllerObject = GameObject.FindGameObjectWithTag ("GameController");
        gameController = gameControllerObject.GetComponent<GameController> ();

        if (gameController.configMode == true) {
            return;
        }

        PlayerController playerController = player.GetComponent<PlayerController>();
        followerVel = playerController.speed;
    }

    void Update () {
        if (gameController.configMode == true) {
            return;
        }
        if (!player) {
            player = GameObject.FindWithTag ("Player");
        }

        if (_followers.Count == 0) {
            return;
        }

        for(int i = 0i < _followers.Counti++) {
            Vector3 dir;

            if (i == 0) {
                if (_followers [i] == null) {
                    resetFollowers ();
                    break;
                } else {
                    Vector3 playerPosition = new Vector3 (0f0f0f);
                    if (player) {
                        playerPosition = player.transform.position;

                    }

                    dir = -1 * _followers [i].transform.position + playerPosition;
                    
                }
            } else {

                if (_followers [i] == null || _followers [i - 1] == null) {
                    resetFollowers ();
                    break;
                } else {
                    dir = -1 * _followers [i].transform.position + _followers [i - 1].transform.position;
                }
            }

            if (dir.magnitude > followerDistance) {
                _followers [i].GetComponent<Rigidbody> ().velocity = dir.normalized * followerVel//normalize the direction vector, and get the velocity vector
            } else {
                _followers [i].GetComponent<Rigidbody> ().velocity = new Vector3 (0f0f0f);
            }

        }
    }

}

 

Captulion

Captulion

  • Kazushige Mori
  • ゲーム
  • 無料