私のやり型ですが,Unityで3Dキャラクターを移動させる方法
これは自分のやり型ですが、いいとは思いませんけど…….
先ず PlayerInputとActorCtrlこの二つのScriptを追加しましょう…….
(その後はプレイヤーの追加すること忘れないで)
その後はPlayerInputにこういう感じで書きます…….
float VerticalFloat ;
float HorizontalFloat ;
public Vector3 MovDir;
public float MovVec;
void Update()
{
HorizontalFloat = Input.GetAxis(“Horizontal”);
VerticalFloat = Input.GetAxis(“Vertical”);
MovVec = Mathf.Sqrt(((VerticalFloat * VerticalFloat) + (HorizontalFloat * HorizontalFloat)));
MovDir = transform.forward * VerticalFloat + transform.right * HorizontalFloat ;
}
#プレイヤーを回転させる方法
その後はActorCtrl.csで自分の書き方ですが、先ずはプレイヤーのRotationのところついに回転させる自分の方法でどうやって回転する方法です
//プレイヤーのモデルは主にchildのところにいますので、ご忘れないように追加しま//しょう…
public GameObject PlayerModel;
PlayerInput playerInput ;
void Awake()
{
if(playerInput == null)
playerInput = GetComponent<PlayerInput>();
}
void Update()
{
if(playerInput.MovVec > 0.1f)
{
PlayerModel.transform.forward = Vector3.Slerp(PlayerModel.transform.forward, playerInput . MovDir, 0.25f );
}
}
こういう方法でプレイヤーが回転することができました。
その後移動させる方法も書きましょう…….
#プレイヤー移動させる方法
先ずはActorCtrl.csで
Vector3 とRigidbodyを追加しましょう
つまり、
Vector3 PlanarVec;
RigidBody rgbd;
public float MovSpd ;
public float WalkingSpd = 200;
Void Awake()
{
if(rgbd == null)
{
rgbd = GetComponent<Rigidbody>();
}
}
void Update()
{
PlanarVec = playerInput. MovVec * PlayerModel.transform.forward * WalkingSpd;
}
void FixedUpdate()
{
rgbd.velocity = new Vector3(PlanarVec.x, rgbd.velocity.y, PlanarVec.z);
}
#プレイヤーが斜めで行くと、早くする気がします。なぜですか?
まあ、これで終わりかな、キャラクターも移動できるし、でも…….
ちょっと待って、プレイヤーが斜めで行くとと、なんか、早くなる気がする?そうです、数学の公式,sqrtを使用すると、こうなってますから、
a^2 + b^2 = c^2
こういう公式忘れないでwwwww。
簡単に言うと、
斜めへ行くと、 1^2 + 1^2で1.4fぐらいになってるので、斜めが少し早い気がするのは間違ってないです
#公式
ではどうすればいいですが、
先ずはPlayerInput.cs で、こういう書き方(正直、こういう書き方正しいなのか、分からない過ぎで、教えるだけで、恥ずかしくなる(*ノωノ))で、1.0f以内でを抑える事ができます。
参考サイド公式
http://squircular.blogspot.com/2015/09/mapping-circle-to-square.html
Vector2 SquareToCircle(Vector2 input)
{
Vector2 output;
output.x = input.x * Mathf.Sqrt(1 -(input.y * input.y)/2.0f );
output.y = input.y * Mathf.Sqrt(1 -(input.x * input.x)/ 2.0f );
return output;
}
そして、PlayerInput.cs
に少し改良しましょう…….
void
Update()
{
HorizontalFloat = Input.GetAxis(“Horizontal”);
VerticalFloat = Input.GetAxis(“Vertical”);
Vector2 TempVec = SquareToCircle(new Vector2(HorizontalFloat, VerticalFloat));
float tempX = TempVec.x;
float tempY= TempVec.y;
MovVec = Mathf.Sqrt(((tempY * tempY) + (tempX * tempX)));
}
#最終的なコードは以下です。
//やっぱり恥ずかしい(*ノωノ)
float VerticalFloat ;
float HorizontalFloat ;
public Vector3 MovDir;
public float MovVec;
void Update()
{
HorizontalFloat = Input.GetAxis(“Horizontal”);
VerticalFloat = Input.GetAxis(“Vertical”);
Vector2 TempVec = SquareToCircle(new Vector2(HorizontalFloat, VerticalFloat));
float tempX = TempVec.x;
float tempY= TempVec.y;
MovVec = Mathf.Sqrt(((tempY * tempY) + (tempX * tempX)));
MovDir = transform.forward * VerticalFloat + transform.right * HorizontalFloat ;
}
Vector2 SquareToCircle(Vector2 input)
{
Vector2 output;
output.x = input.x * Mathf.Sqrt(1-(input.y * input.y)/2.0f);
output.y = input.y * Mathf.Sqrt(1-(input.x * input.x)/ 2.0f );
return output;
}
public GameObject PlayerModel;
PlayerInput playerInput ;
Vector3 PlanarVec;
RigidBody rgbd;
public float MovSpd ;
public float WalkingSpd = 200;
void Awake()
{
if(playerInput == null)
playerInput = GetComponent<PlayerInput
>
();
}
void Update()
{
if(playerInput . MovVec > 0.1f)
{
PlayerModel.transform.forward = Vector3.Slerp(PlayerModel.transform.forward, playerInput . MovDir, 0.25f );
}
PlanarVec = playerInput. MovVec * PlayerModel.transform.forward * WalkingSpd;
}
void FixedUpdate()
{
rgbd.velocity = new Vector3(PlanarVec.x * Time.fixedDeltaTime, rgbd.velocity.y, PlanarVec.z * Time.fixedDeltaTime);
}
自分あんまり教える立場の経験ほぼゼロなので、そして、作ってる人なので、正直に言うと、正しいなのか、間違えるなのか、分からないことたくさんありますなので、参考になれば嬉しいです。
ZfSilverFox