今日はまだ戦車プロジェクトです
。wheelColliderを使ってモバイルを試してみたかったのです。このビデオを見るまで:
シンプルな戦車コントローラー+カメラコントローラーの作り方| Unityチュートリアル
は外国人が行う必要があります。彼は非常に熟練していますが、効果はあります。とても良いです。あまり良くありません。。
実際、よく考えてみてください。WarThunderのような本物のゲームですか、彼の操作の感触は本当に好きですか?
実際、私は物理学を持っているだけでよく、それからそれほど固く動かないで、加速や減速のように感じないでください。。。
物理的効果は依然として剛体と衝突型加速器に依存していますが、加速と減速です。。。
モバイルの実装を見ました
transform.Translate(new Vector3(0f, 0f, moveSpeed) * Time.deltaTime);
その中で、moveSpeedは定数値であり、これを使用して直接移動することは実際には機能しません。
実際、私はずっと前にそれを考えました、GetAxisを使用することはその効果をもたらすでしょう。
でも回り道をして、Unityが公式に提供している戦車プロジェクトを見つけました
。このプロジェクトから何かを学ぶことができるかもしれません。
private void Move ()
{
// Create a vector in the direction the tank is facing with a magnitude based on the input, speed and the time between frames.
Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;
// Apply this movement to the rigidbody's position.
m_Rigidbody.MovePosition(m_Rigidbody.position + movement);
}
private void Turn ()
{
// Determine the number of degrees to be turned based on the input, speed and time between frames.
float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;
// Make this into a rotation in the y axis.
Quaternion turnRotation = Quaternion.Euler (0f, turn, 0f);
// Apply this rotation to the rigidbody's rotation.
m_Rigidbody.MoveRotation (m_Rigidbody.rotation * turnRotation);
}
これは本当に便利です。RigidBodyのMovePositionとMoveRotationを使用し、リジッドボディコンポーネントも使用します。m_MovementInputValueとm_TurnInputValueはどちらもGetAxisを介して取得されるため、どちらの軸が特定であるかを指定する必要はありません。最終的な効果は大丈夫です!
リープのような機能を使って効果を高めることはできますか?
もちろん、今日では、移動方法の変更に加えて、トラックテクスチャの移動も、回転と各ホイールに合うように最適化されています。
他に何もないとしても、砲塔を作る時が来ました。
上記で書いたことは今日で終わったはずですが、GetAxisを使用しているのに、なぜこの方法を使用してクローラーとホイールの効果を実現するのかと突然思いました。ばかじゃないですか。左右のコードは非常に似ています。
坦克向后移动
if (Input.GetKey(KeyCode.S))
{
//坦克左右两边车轮转动
foreach (var wheel in LeftWheels)
{
wheel.transform.Rotate(new Vector3(-0.5f * wheelSpeed, 0f, 0f));
}
foreach (var wheel in RightWheels)
{
wheel.transform.Rotate(new Vector3(-0.5f * wheelSpeed, 0f, 0f));
}
//履带滚动效果
LeftTrack.transform.GetComponent<Renderer>().material.mainTextureOffset += new Vector2(0, 0.5f * trackSpeed * Time.deltaTime);
RightTrack.transform.GetComponent<Renderer>().material.mainTextureOffset += new Vector2(0, 0.5f * trackSpeed * Time.deltaTime);
//坦克车身向后移动
//transform.Translate(new Vector3(0f, 0f, -moveSpeed)*Time.deltaTime);
//flag = -1;
}
GetAxisで取得した値を1回だけ直接設定する必要があります。
// 这些都是为了让履带和轮子看上去在动
//坦克左右两边车轮转动
foreach (var wheel in LeftWheels)
{
wheel.transform.Rotate(new Vector3(wheelSpeed * vertical, 0f, 0f));
}
foreach (var wheel in RightWheels)
{
wheel.transform.Rotate(new Vector3(wheelSpeed * vertical, 0f, 0f));
}
//履带滚动效果
// 前后
LeftTrack.transform.GetComponent<MeshRenderer>().material.mainTextureOffset += new Vector2(0, -trackSpeed * vertical * Time.deltaTime);
RightTrack.transform.GetComponent<MeshRenderer>().material.mainTextureOffset += new Vector2(0, -trackSpeed * vertical * Time.deltaTime);
// 左右
LeftTrack.transform.GetComponent<MeshRenderer>().material.mainTextureOffset += new Vector2(0, 0.6f * -trackSpeed * horizontal * Time.deltaTime);
RightTrack.transform.GetComponent<MeshRenderer>().material.mainTextureOffset += new Vector2(0, 0.6f * trackSpeed * horizontal * Time.deltaTime);