Unity 私のやり型ですが,Unityで３Ｄキャラクターを移動させる方法

私のやり型ですが,Unityで３Ｄキャラクターを移動させる方法

これは自分のやり型ですが、いいとは思いませんけど…….

先ず　PlayerInputとActorCtrlこの二つのScriptを追加しましょう…….
(その後はプレイヤーの追加すること忘れないで)


その後はPlayerInputにこういう感じで書きます…….

```C#:PlayerInput.cs 

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のところついに回転させる自分の方法でどうやって回転する方法です

```C#:ActorCtrl.cs
//プレイヤーのモデルは主に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を追加しましょう
つまり、

```C#:ActorCtrl.cs
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


```C#
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 
に少し改良しましょう…….


```C#: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)));




}

```

#最終的なコードは以下です。
//やっぱり恥ずかしい(*ﾉωﾉ)


```C#:PlayerInput.cs

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;
}

```


















```C#:ActorCtrl.cs
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