2014年12月23日火曜日

【Unity】 近況


わらわら…

最近少し困ったことを列挙しておこう。


■ ある地点まで等速で動き、その地点で止まる

古いRPGとかによくあった動き方です。
1マス分動いたら止まる。これが意外と難しかったのです。
Lerp使えば簡単に2点間を移動できるんですが動きが等速じゃない!
ということで Lerp と timer の組合せで等速を実現します。

    void Update () 
    {
        if(_timer > 1.0f) Turning();

        transform.position = Vector3.Lerp(_currentPos, _distPos,  _timer);
        _timer += _speed * Time.deltaTime;
    }

    void Turning()
    {
         _currentPos = _distPos;

        //新しい移動地点の設定
        //ここで適当に _distPos を書き換える

        _timer = 0.0f;
    }

こんな感じで。


■ ランダムに方向を決める

上下左右ランダムに動くオブジェクトをつくりたい。

float _random = Random.value;

すると _random には 0.0 から 1.0 の値がランダムに入ります。
あとは条件分岐で上下左右振り分ければいいだけです。


■ Instantiate で生成したクローンの名前に (Clone) を付けないようにする

(Clone) はまぁ便利なんですが…というほど便利さを感じているかというと微妙ですね。

Enemy が EnemyPrefab を Instantiate で生成すると Enemy(Clone) になります。
Enemy(Clone) が生成すると Enemy(Clone)(Clone) になります。
といったようにEnemyを分裂させる処理の場合 Enemy(Clone)(Clone)(Clone)… と (Clone) だらけになるので (Clone) 消しましょう。

    GameObject _obj = Instantiate (_prefab, transform.position, Quaternion.identity) as GameObject;
    _obj.name = "Enemy";

こうすると(Clone)はなくなります。


■ Instantiate で生成したクローンに値を持たせる

参考:【Unity】 Instantiateで生成したGameObjectのScriptに引数を渡す方法

    void Deplicate()
    {
        _life -= 1000;
        GameObject _obj = Instantiate (_deplicate, transform.position, Quaternion.identity) as GameObject;
        _obj.name = "Enemy";
        EnemyMovement _objScript = _obj.GetComponent<EnemyMovement>();
        _objScript._currentNo = _currentNo;
        _objScript._nextNo = _currentNo;
    }

やろうとしてることはライフが2000になったら1000減らして分裂をつくる~みたいな感じです。
左辺の _objScript._currentNo がクローンの持つ値になり、右辺がコピー元の _currentNo です。同じスクリプトを持っているのです少しわかりにくいですね。

0 件のコメント:

コメントを投稿