タンクプロジェクトのカメラの改善と妨害効果の開発記録-ユニティノート(2020.12.1)

久しぶり。
今日は進捗状況を報告します。このタスクが完了すると、これらのメモはすべて完全なブログに置き換えられます。
久しぶりなので順番に来ません。
最初に言いたいのは、Cinemachineプラグインをあきらめて、2016年にSebastian Lagueがリリースした一連のビデオ
キャラクター作成(E08:サードパーソンカメラ)について学ぶためにYouTubeに
アクセスしたことですこれは次のように言えます。かなり単純なサードパーソンカメラスクリプト。自分で手に入れて、スクロールホイールでズームイン・ズームアウトする機能を追加しました。大きな男は大きな男になる価値があり、私が書いたものと比較して、コードは非常に簡潔です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ThirdPersonCamera : MonoBehaviour
{
    
    
    // 鼠标灵敏度
    public float mouseSensitivity = 10f;
    // 滚轮灵敏度
    public float mouseScrollSensitivity = 5f;
    // 第三人称目标
    public Transform target;
    // 摄像机离目标的位置
    public float distanceFromTarget = 2f;
    // y方向的限制
    public Vector2 pitchMinMax = new Vector2(-40f, 85f);
    // 旋转运动平滑时间
    public float rotationSmoothTime = 0.12f;
    // 是否锁定鼠标
    public bool lockCursor;

    // x方向
    private float yaw;
    // y方向
    private float pitch;
    // 滚轮拉近拉远摄像机
    private float distance;
    // 旋转运动平滑速度
    Vector3 rotationSmoothVelocity;
    // 当前的旋转
    Vector3 currentRotation;

    void Start()
    {
    
    
        if(lockCursor)
        {
    
    
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
        }

        distance = distanceFromTarget;
    }

    // 使用LateUpdate在target.position设置好以后设置摄像机的位置
    void LateUpdate()
    {
    
    
        yaw += Input.GetAxis("Mouse X") * mouseSensitivity;
        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity;
        distance -= Input.GetAxis("Mouse ScrollWheel") * mouseScrollSensitivity;
        
        pitch = Mathf.Clamp(pitch, pitchMinMax.x, pitchMinMax.y);
        distance = Mathf.Clamp(distance, 3f, 16f);

        currentRotation = Vector3.SmoothDamp(currentRotation, new Vector3(pitch, yaw, 0f), ref rotationSmoothVelocity, rotationSmoothTime);

        Vector3 targetRotation = currentRotation;
        transform.eulerAngles = targetRotation;

        distanceFromTarget = distance;

        // 摄像机的位置设置在目标位置减去自身z轴方向上的特定距离
        transform.position = target.position - transform.forward * distanceFromTarget;
    }
}

Cinemachineを使用しない理由として、1つは、教師のコンピュータが表示されたときにUnity2019がないこと、もう1つは、このような完全なパッケージを使用する必要がないことです。
そこで、長距離のターゲットを狙うのに便利な一人称カメラを作りました。左シフトキーを押すと、三人称カメラと一人称カメラを切り替えることができます。一人称カメラは、ミラーを開く効果を実現するためのスクロールホイール。原理はfovを変更することですが、視野を拡大した後はマウスの感度を下げる必要があるという小さな詳細もあります。以下は一人称カメラコードです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FPCamera : MonoBehaviour
{
    
    
    public Transform cameraTransform;
    public float mouseSentivity;
    public Vector2 maxMinAngle;
    public float mouseScrollSpeed = 5f;

    private Vector3 m_mouseInputValue;

    private void Start()
    {
    
    
        m_mouseInputValue = new Vector3();
    }

    void Update()
    {
    
    
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");
        float mouseScrollWheel = -Input.GetAxis("Mouse ScrollWheel");
        m_mouseInputValue.y += mouseX * mouseSentivity;
        m_mouseInputValue.x -= mouseY * mouseSentivity;
        
        // 限制垂直旋转的角度(以符合现实情况)
        m_mouseInputValue.x = Mathf.Clamp(m_mouseInputValue.x, maxMinAngle.x, maxMinAngle.y);
        // 水平旋转整个Controller
        this.transform.localRotation = Quaternion.Euler(0, m_mouseInputValue.y, 0);
        // 垂直只旋转摄像机
        cameraTransform.localRotation = Quaternion.Euler(m_mouseInputValue.x, 0, 0);
        // 摄像机缩放
        float fov = cameraTransform.GetComponent<Camera>().fieldOfView;
        mouseSentivity = 0.5f + (fov / 10);
        fov += mouseScrollWheel * mouseScrollSpeed;
        fov = Mathf.Clamp(fov, 5f, 40f);
        cameraTransform.GetComponent<Camera>().fieldOfView = fov;
    }
}

一人称カメラと三人称カメラが独自に制御し、相互作用しないという小さな問題があります。これにより、一人称カメラが一方向を向くようになります。三人称カメラに切り替えます。サードパーソンが切り替わる前に方向がわかります。これは人々を非常に奇妙に感じさせます。、いつ彼のためにそれを統合したいですか。


それから、しばらく前に実現された爆発と破壊の機能があります。
ここに画像の説明を挿入
方法は単純で失礼であり、ゲームオブジェクトを材料内の破壊タンクのプレハブに直接置き換えます。いわゆるブラストとは、車体を使ったゲームオブジェクトとタレットを使ったゲームオブジェクトを作成することです。ブラストするオブジェクトをこれら2つのオブジェクトで正しい位置に戻し、タレットに力を加えます。各爆風を作るための乱数効果はわずかに異なります。
破壊に関しては、私が考えたダメージメカニズムについて話さなければなりません。実際には非常に簡単です。ヒット後
、敵にマウントされたスクリプト乱数を使用して、破壊されたかどうかを判断します。メンバーは無意識です/破損しているか、破損はありません。鎧の厚さを計算して手放してみませんか?鎧のせいでできません。

    private DamageType FirePowerTest()
    {
    
    
        DamageType damage = DamageType.NoEffect;
        float firePower = Random.Range(2f, 7f);
        if(firePower < armor)
        {
    
    
            damage = DamageType.NoEffect;
        }
        else
        {
    
    
            if(firePower < armor + 1)
            {
    
    
                damage = DamageType.BailedOut;
            }
            else
            {
    
    
                if(firePower <= armor + 3)
                {
    
    
                    damage = DamageType.Destoryed;
                }
                else
                {
    
    
                    if(firePower > armor + 3)
                    damage = DamageType.AmmoDetonation;
                }
            }
        }

        return damage;
    }

この機能は火力テストと呼ばれ、ボードゲームFOWのルールに基づいています。この第二次世界大戦のウォーゲームボードゲームが私の考えの源です。このゲームでは、戦車が破壊されるかどうかだけでなく、揺れるために使用されます。ダイスとそれが当たるかどうか。それはダイスでもあります。これを復元するためだけに乱数を使用します。もちろん、やりすぎだと思いますが、少なくとも前部と後部の装甲を分けることができなければなりません。組み合わせたコライダーを使用してさまざまなモジュール(トラック、タレット、フロントアーマー、リアアーマー)を実装しようとしましたが、失敗しました。さまざまなコライダーを認識するには、タグが異なる剛体のゲームオブジェクトが必要です。敵は1つしかありません。体、どうすればいいの?私の最終的な計画は、シェルが発射される角度とそれが衝突ボックスと衝突する角度に基づいて間接的に推測することです。または単にそれを行います。


バレルの照準インジケーターリングも少し離れたところにあります
ここに画像の説明を挿入
。WorldofTanksとWarThunderをプレイしたことのある友達は、砲塔が特定の速度で回転することを知っている必要があります。ゲームメーカーは、視角を動かすために砲塔を動かします。ゆっくりと、砲塔の回転から視角を離します。照準は照準の対象となる方向であり、砲塔は自速でこの方向に回転するため、砲身が回転した場所を示すインジケーターが必要です。
原則は言うのは難しいことではありません。つまり、バレルの最初の100の長さにUIを配置してから、WorldToScreenPointを呼び出します。しかし、それを書いたとき、私は多くの落とし穴を踏んで、最高の結果を達成しました、そしてそれはまだ正確ではありません。コードはリリースされません。恥。


高速物体の衝突問題については、発射体がユニティ独自の剛体ロジスティクスシステムを使用しているため、連続動的衝突検出モードが直接使用されます。これは、パフォーマンスは劣りますが便利です。ハハ。光線は使用されません。
ここに画像の説明を挿入
剛体


これまでのところ、このプロジェクトの欠点は何ですか?最大の欠点はテクノロジーの欠如だと思いますが、他に方法はありません。しかし、私の古い職業であるスクリプトの作成では、今回作成したスクリプトは失敗したと思います。作成したとき、タンクを継承可能なカテゴリとして作成しませんでした。後で新しいものを追加する場合、タンクのタイプは次のとおりです。面倒。今変更するのはとても面倒です。タンクの機能を書きましたが、タイプを区別していません。


しかし、それでもこのプロジェクトをプレイ可能なレベルにする必要があります。次に行うことは、最も難しいと思う敵のAIです。


この文章を書いている時点でプロジェクトは完了していますが、期末の締め切りが厳しいため、今後この戦車プロジェクトについては何も書きませんでした。
簡単に説明すると、このプロジェクトは最終的に「Burning Horizo​​n」と名付けられました。フォローアップAIとプロジェクトの改善については、Unity3Dによって作成されたタンクゲーム-「BurningHorizo​​n」を参照してください。

おすすめ

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