【Unity】どうぶつの森 自作 #2 〜Playerの移動〜

2020年4月7日火曜日

Unity どうぶつの森自作

t f B! P L

前回はモデリングをした。



WASD移動実装までの道のり

プレイヤーにはRigidbody、Box Collideを取り付け、転倒防止のためx,z のFreezeRatationにチェックを入れた。

そして次に移動に取り掛かったのだが、

・PlayerをMain Cameraの子オブジェクトにし、Main Cameraを動かす。
↓問題発生
 ・Main CameraをPlayerの子オブジェクトにし、Playerを動かす
↓問題発生
・Playerを動かし、その動きをMain Cameraに連動させる

となった。
その経緯を書いていきます。

1つ目の問題点

PlayerをMain Cameraの子オブジェクトに。
Main Cameraを動かして、その子であるPlayerが自動的に動く。

という私がUnity1week「逆」(ReverseString)の時につかった手法である。

しかし、これではPlayerがなにかにぶつかって進めなくなった時、カメラだけ動き、Playerが取り残されるという状態になってしまった。

2つ目の問題点

先程の問題点を改善しようと、PlayerとMain Cameraの親子関係を逆にしてみた。
これで移動は良かった。

ただ、Playerを、「Playerが移動している方向に向ける処理」が問題であった。

 Playerのrotationを変更すると同時にMain Cameraのrotationも変更する必要がででしまうのだ。

 PlayerのスクリプトにMain Cameraに関する処理は出来るだけ書きたくない。(1つのスクリプトには1つの役割にしたい)

この方法も破棄になった

解決

ここで、PlayerとMain Cameraに親子関係を持たせること事態を止めることにした。

と言うのも後々のことを考えて、だ。

今後、Main Cameraの動きは Player追従だけではなくなってくる。

例えば、

・バック(アイテム欄)も操作する時にカメラの位置が、Playerに近くなり、角度も変わる。
・家の中に入る時、Playerは動くけどカメラ位置は変わらない。
・家の中ではカメラの動きに制限がかかる

だったら、Main Cameraを独立させてしまおうと言うことだ。

追従機能は、PlayerのX座標とZ座標を取得して、Main Cameraの位置を決定していく。

その他の処理を入れる時は、Playerの座標取得のフラグをfalseにする。

ということにした。


C#スクリプト

Main Cameraのスクリプト
using UnityEngine;

public class CamaraController : MonoBehaviour
{
    public Transform player;

    const float offset = -7;

    void Start() {
        if(player == null) player = GameObject.Find("Player").transform;
    }

    void Update() {
        transform.position = new Vector3(player.position.x,
                                         transform.position.y,
                                         player.position.z + offset);
    }
}


自己紹介

自分の写真
県立高校理数科2年
Unity2年目
Twitter
Note

人気の投稿

[Vim] coc.nvim + coc-clangdの構文チェックでboostのエラーが発生する

C++の拡張ライブラリ、Boost。 AtCoderでも使用が認められているライブラリです。 様々な便利機能が搭載されています。 競技プログラミングで使えるBoostライブラリ 初級編 から一部抜粋すると、 boost...

QooQ