Поэтому я попытался добавить в простой шутер от первого лица физические снаряды / пули со скоростью и гравитацией, а не просто Raycasting и использование 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);
Клиент стреляет, команда порождает пулю на сервере, а затем пуля создается для каждого клиента, чтобы ее можно было увидеть. Проблема, с которой я столкнулся с этим методом, заключается в том, что сервер вычисляет, попала ли пуля, и это не всегда совпадает с тем, как это выглядит для игрока.
Как я мог эффективно и надежно обращаться со своими снарядами? Могу ли я каким-то образом заставить клиента, который на самом деле стреляет, произвести расчет пули и проверить, попадает ли она, в то время как другие клиенты все еще могут видеть пулю?
Заранее спасибо.