シンプルな戦車移動制御の完成度-ユニティノート(2020.11.5)

今日はまだ戦車プロジェクトです
。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);

おすすめ

転載: blog.csdn.net/qq_37856544/article/details/109520347