[英]Unity3D. How to properly handle projectile in a multiplayer shooter?
因此,我嘗試將具有速度和重力的物理彈丸/子彈添加到一個簡單的第一人稱射擊游戲中,而不是僅進行射線投射,如果客戶碰到東西,則使用Command。 經過一番嘗試和錯誤之后,我發現將彈丸與對撞機配合使用並不是最佳的處理方法,因為對於快速移動的物體,其物理計算速度不夠快。 所以我瘋了自己的子彈物理學,如下所示。
private float startingVelocity = 50f;
private float gravity = 9.81f;
private Vector3 forwardDirection;
private Vector3 previousPosition;
private Vector3 nextPosition;
private Vector3 movementDirection;
private Vector3 velocity;
void Start ()
{
previousPosition = transform.position;
forwardDirection = transform.forward.normalized;
velocity = forwardDirection*startingVelocity;
}
void Update ()
{
previousPosition = transform.position;
velocity += new Vector3(0f, -1f, 0f)*gravity*Time.deltaTime;
nextPosition = previousPosition + velocity*Time.deltaTime;
transform.position = nextPosition;
Debug.DrawLine(previousPosition, nextPosition, Color.white, 10f);
movementDirection = nextPosition - previousPosition;
if (movementDirection!=Vector3.zero)
{
transform.rotation = Quaternion.LookRotation(movementDirection);
}
CheckImpact(previousPosition, nextPosition);
}
CheckImpact函數實際上只是在兩個位置之間進行射線廣播,以檢查彈丸撞擊的方式是否存在牆壁或玩家。 當擊中某物時,將調用命令,服務器會對目標造成傷害。
子彈本身是這樣生成的:
[Command]
void CmdShootProjectile(string projectilePath, Vector3 _position, Quaternion _rotation)
{
GameObject projectile = Instantiate(Resources.Load<GameObject>(projectilePath), _position, _rotation);
NetworkServer.Spawn(projectile);
客戶端射擊,命令在服務器上生成項目符號,然后為每個客戶端生成項目符號,以便可以看到它。 我在使用此方法時遇到的問題是,服務器會計算子彈是否被擊中,而這並不總是與播放器的外觀保持一致。
我如何有效,可靠地處理彈丸? 我能以某種方式讓實際射擊的客戶計算子彈並檢查它是否命中,而其他客戶仍然能夠看到子彈嗎?
提前致謝。
不幸的是,幾乎不可能有100%安全可靠的方法來做到這一點。 但是,對此有相當多的研究(例如Valve公司(《反恐精英》)等游戲公司)。
當前的共識是確實在服務器端而不是在客戶端進行計算。 有利弊。
優點:
缺點:
就個人而言,我喜歡您的方法,現在應該還可以。 隨着游戲的進展,以及對更好的系統的需求,您可以對其進行更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.