2017-01-04 7 views
1

を無視して、カメラに取り付けられている:プレーヤーは、このように、Yのaxizにカメラを回転させることができるので移動し、このコードは回転

transform.position += Input.GetAxis("Vertical") * transform.forward * mod; 
transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 

Iはの.forwardと.RIGHTを使用しましたどの方向にカメラが前方キーに向いていても常にカメラを相対的に前方に移動させ、左側のキーはそれを相対的に左に移動させます。ちょうど明確にするために - 私はそれが現実空間ではなくローカル空間で動くようにします。それは、向きが向いているので、必ずしもVector3(0,0,1)ではありません。

カメラには無料のローミングがあり、親や対象はありません。

問題は、カメラの視線が45°であることです。 transform.forwardを使用すると、その高さが変更されます。また、高さを固定値に設定したくないので、カメラの高さを変更するスクロールコードもあります。移動をXとZのみに制限するにはどうしたらいいですか?

更新:このコードはうまくいきませんが、xyLe_が示唆しているように、Vector3.Projectを使用するより洗練されたソリューションがあると確信しています。もし私がそれを理解するなら、私は彼の答えに追加します。

mod = Time.deltaTime * 30; 
float yPos = transform.position.y; 
pos = transform.position; 
pos += Input.GetAxis("Vertical") * transform.forward * mod; 
pos.y = yPos; 
pos += Input.GetAxis("Horizontal") * transform.right * mod; 
pos += Input.GetAxis("Mouse ScrollWheel") * transform.up * mod * -30; 
+0

[Math.Clamp](https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html)が役に立ちます。 – Catwood

+0

"ワールド"の順方向を使いたいですか?それがあなたの場合であれば、ワールド方向は一定です。Vector3.Up = new Vector3(0、1、0); –

+0

'transform.forward'を' transform.right'の回りに回転させてxz平面に合わせます。 – TheDjentleman

答えて

3

今はナンセンス話かもしれないが、それは私には非常に簡単そうです:

Vector3 desiredDirection = Vector3.Normalize(new Vector3(transform.forward.x, transform.position.y, transform.forward.z))

だけtransform.position.yの高さで決済されるX-Z平面上にtransform.forwardを投影します。これを行うと(通常は)ベクトルが少し短くなるので、それを再正規化する必要があります。

視覚化するために:私が正しくあなたを理解していれば

vec img

を、transform.forwardは黒のベクトルに対応して、あなたは緑のベクトルを持っていると思います。黒のベクトルのy成分を赤のドットの位置y成分のy成分に設定すると、紫色のベクトルが得られます。これは再正規化する必要があります。

+0

それは一言で言えば、はい。私はそれをコード化することができますが、私はあなたの助けのために戻って来なければならない場合があります参照してください) – Absinthe

0

これが解決されているにもかかわらず、以下の解決策はこの問題を抱えている他の人に役立つはずです。

に.get transform.forward

ここでは、その回転を無視しtransform.forwardに向かって移動するための適切な方法です。 InverseTransformDirection

.SETとローカル空間に

.Convertそれ0からy軸。

。これをdir.Normalize()で正規化します。

transform.positionに新しいposを付けます。

public float mod = 2; 

void Update() 
{ 
    //Get Forward face 
    Vector3 dir = transform.forward; 
    //Convert to local Space 
    dir = transform.InverseTransformDirection(dir); 
    //Reset/Ignore y axis 
    dir.y = 0; 
    dir.Normalize(); 

    //Append the new pos to the `transform.position`. 
    transform.position += dir * Input.GetAxis("Vertical") * mod; 
    transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 
} 

別の方法(推奨):

カメラ45の角度に傾斜しているので:

.Rotateそれ.Move

-45にカメラは通常

バック 45

public float startingOffset = 45; 
public float mod = 2; 


// Update is called once per frame 
void Update() 
{ 
    //Rotate it to -45 
    transform.Rotate(new Vector3(-startingOffset, 0, 0)); 

    // Move the camera normally 
    transform.position += Input.GetAxis("Vertical") * transform.forward * mod; 
    transform.position += Input.GetAxis("Horizontal") * transform.right * mod; 

    //Rotate it back to 45 
    transform.Rotate(new Vector3(startingOffset, 0, 0)); 
} 

これらの両方が動作しなければならないが、好ましい方法は、最初のものでなければならないに

.Rotateこと。

関連する問題