私のやり型ですが,Unityで3Dキャタピラーを移動させる方法
これは自分のやり型ですが、いいとは思いませんけど…….
先ず PlayerInputとActorCtrlこの二つのScriptを追加しましょう…….
(その後はプレイヤーの追加すること忘れないで)
その後はPlayerInputにこういう感じで書きます…….
floatVerticalFloat;floatHorizontalFloat;Vector3MovDir;floatMovVec;voidUpdate(){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のところにいますので、ご忘れないように追加しま//しょう…publicGameObjectPlayerModel;PlayerInputplayerInput;voidAwake(){if(playerInput==null)playerInput=GetComponent<PlayerInput>();}voidUpdate(){if(playerInput.MovVec>0.1f){PlayerModel.transform.forward=Vector3.Slerp(PlayerModel.transform.forward,playerInput.MovDir,0.25f);}}
こういう方法でプレイヤーが回転することができました。
その後移動させる方法も書きましょう…….
プレイヤー移動させる方法
先ずはActorCtrl.csで
Vector3 とRigidbodyを追加しましょう
つまり、
Vector3PlanarVec;RigidBodyrgbd;publicfloatMovSpd;publicfloatWalkingSpd=200;VoidAwake(){if(rgbd==null){rgbd=GetComponent<Rigidbody>();}}voidUpdate(){PlanarVec=playerInput.MovVec*PlayerModel.transform.forward*WalkingSpd;}voidFixedUpdate(){rgbd.velocity=newVector3(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
Vector2SquareToCircle(Vector2input){Vector2output;output.x=input.x*Mathf.Sqrt((input.y*input.y)/2.0f);output.y=input.y*Mathf.Sqrt((input.x*input.x)/2.0f);returnoutput;}
そして、PlayerInput.cs
に少し改良しましょう…….
voidUpdate(){HorizontalFloat=Input.GetAxis(“Horizontal”);VerticalFloat=Input.GetAxis(“Vertical”);Vector2TempVec=SquareToCircle(newVector2(HorizontalFloat,VerticalFloat));floattempX=TempVec.x;floattempY=TempVec.y;MovVec=Mathf.Sqrt(((tempY*tempY)+(tempX*tempX)));}
最終的なコードは以下です。
//やっぱり恥ずかしい(*ノωノ)
floatVerticalFloat;floatHorizontalFloat;Vector3MovDir;floatMovVec;voidUpdate(){HorizontalFloat=Input.GetAxis(“Horizontal”);VerticalFloat=Input.GetAxis(“Vertical”);Vector2TempVec=SquareToCircle(newVector2(HorizontalFloat,VerticalFloat));floattempX=TempVec.x;floattempY=TempVec.y;MovVec=Mathf.Sqrt(((tempY*tempY)+(tempX*tempX)));MovDir=transform.forward*VerticalFloat+transform.right*HorizontalFloat;}Vector2SquareToCircle(Vector2input){Vector2output;output.x=input.x*Mathf.Sqrt((input.y*input.y)/2.0f);output.y=input.y*Mathf.Sqrt((input.x*input.x)/2.0f);returnoutput;}
publicGameObjectPlayerModel;PlayerInputplayerInput;Vector3PlanarVec;RigidBodyrgbd;publicfloatMovSpd;publicfloatWalkingSpd=200;voidAwake(){if(playerInput==null)playerInput=GetComponent<PlayerInput>();}voidUpdate(){if(playerInput.MovVec>0.1f){PlayerModel.transform.forward=Vector3.Slerp(PlayerModel.transform.forward,playerInput.MovDir,0.25f);}PlanarVec=playerInput.MovVec*PlayerModel.transform.forward*WalkingSpd;}voidFixedUpdate(){rgbd.velocity=newVector3(PlanarVec.x*Time.fixedDeltaTime,rgbd.velocity.y,PlanarVec.z*FixedDeltaTime);}
自分あんまり教える立場の経験ほぼゼロなので、そして、作ってる人なので、正直に言うと、正しいなのか、間違えるなのか、分からないことたくさんありますなので、参考になれば嬉しいです。
ZfSilverFox