Unity一人称制御スクリプト
1.一般的な考え方:
(1)モバイル機能付き。
(2)カメラが追従します。
(3)マウスの動きで視野角を制御できます。
2.特定の実装方法:
(1)モバイル機能スクリプト:
ここでは、リジッドボディコンポーネントのaddforceを使用して、移動する力を適用します。具体的なコードは次のとおりです。注:(この関数では移動は役に立たないため、主に他の関数では、このブール値を無視してください)
private bool isMoving;
private Rigidbody PlayerRig;
public float Speed=2;
void Start()
{
PlayerRig = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
PlayerMove();
}
void PlayerMove()
{
isMoving = false;
SpeedControl();
if (Input.GetKey(KeyCode.W)) //ahead
{
PlayerRig.AddForce(new Vector3(0, 0, 1)*Time.deltaTime*Speed*200);
isMoving = true;
}
else
if (Input.GetKey(KeyCode.S)) //right
{
PlayerRig.AddForce(new Vector3(0, 0, -1) * Time.deltaTime * Speed * 200);
isMoving = true;
}
else
if (Input.GetKey(KeyCode.A)) //left
{
PlayerRig.AddForce(new Vector3(-1, 0, 0) * Time.deltaTime * Speed * 200);
isMoving = true;
}
else
if (Input.GetKey(KeyCode.D)) //back
{
PlayerRig.AddForce(new Vector3(1, 0, 0) * Time.deltaTime * Speed * 200);
isMoving = true;
}
else
if (Input.GetKey(KeyCode.Space)) //jump
{
PlayerRig.AddForce(new Vector3(0, 1, 0) * Time.deltaTime * Speed * 300);
isMoving = true;
}
}
上記のコードを分析すると、剛体コンポーネントをプレーヤーオブジェクトにぶら下げる必要があることがわかります。剛体コンポーネントも宣言してコードで取得する必要があります。これに基づいて、rigidbody.AddForce(Vector3))を使用して力を加えることができます。 AddForceの後にTime.delttimeが追加されます。これは、フォースアプリケーション関数がフレームなしで呼び出されるためです。つまり、フォースは1秒あたり60回適用されます!(直接現場放出= v =)およびdeltatime = 1/60つまり、フレーム内の回数です。この掛け算とは、1秒間に1回力が加えられることを意味し、掛け算後の定数が調整に影響します。力が小さいと感じられる場合は、大きい数を掛けるか、リジッドボディコンポーネントを掛けることができます。抵抗値は小さい値に変更できます*
(2)
ここに続くカメラには、いくつかのベクトル追加の問題があります。空間ベクトルは簡単に描くことができないため、この問題を説明するために単純な平面直交座標を使用できます。まず、特定のコードを見てみましょう。 :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowTarget : MonoBehaviour
{
public Transform PlayerTransform;
private Vector3 offset;//最开始的偏移量
// Start is called before the first frame update
void Start()
{
offset = transform.position - PlayerTransform.position;
}
// Update is called once per frame
void Update()
{
transform.position = PlayerTransform.position + offset;
}
}
オフセットはオフセットです。たとえば、スペースにはA(1,2)、B(2,1)、および2つのポイントがあります。ベクトルABは、Aに対するBのオフセットです。つまり、ポイントBをポイントAとBの座標を(2,1)から(1,2)に変更する必要があります。ABベクトルはAB =(-1,1)、B + AB =(2,1)+(-1,1)=です。 (1,2)= A、それは今明らかですか?操作されたオブジェクトに対してカメラがどのように動いても相対的に保つには、つまり、2つのオブジェクトの位置をいつでも調整して相対的に静止させるには、transform.positionを介してカメラの位置を変更し、このスクリプトをCamera〜
(3)に掛けます。マウスの動きで視野角を制御します。
まだ最初にコーディングする
void AngleControl()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
float X = Input.GetAxis("Mouse X") * RotateSpeed;
float Y = Input.GetAxis("Mouse Y") * RotateSpeed;
Vector3 speed = new Vector3(h, 0, v);
Maincameral.transform.localRotation = Maincameral.transform.localRotation * Quaternion.Euler(-Y,0,0);
transform.localRotation = transform.localRotation * Quaternion.Euler(0, X, 0);
}
基本的な機能が実現されている場合でも、エフェクト画像を配置します。
他の要素は無視できます^ v ^全体的な実装は、四元数を使用する必要がある理由です。オイラーは、角度を設定するために回転を変更する代わりに、ユニバーサルロックロックの問題を引き起こし、横向きに見えます。全体的な遠近法による歪みの結果については、次の号で説明します。じゃね〜