Как вы совершаете атаку мечом

#c# #unity3d

Вопрос:

Как вы, ребята, атакуете мечом? Я задаю этот вопрос, потому что я не знаю, как атаковать мечом, а учебник, который я смотрю, показывает только атаку снарядом. Я хочу научиться атаковать мечом для игры, которую я создаю. Вот код, который я показываю

     void AttackPlayer()
{
    //Make sure that the enemy doesn't move
    agent.SetDestination(transform.position);

    transform.LookAt(player);
    if (!alreadyAttacked)
    {
        //Attack Code Is underneath
        Rigidbody rb = Instantiate(projectile, transform.positino, Quaternion.identity).GetComponent<Rigidbody>();
        rb.AddForce(transform.forward * 32f, ForceMode.Impulse);
        rb.AddForce(transform.up * 8f, ForceMode.Impulse);

        //Attack Code Is Above. I want a sword attack instead of a projectile
        alreadyAttacked = true;
        Invoke(nameof(ResetAttack), timeBetweenAttacks);
    }
}
 

Ответ №1:

Если у вас есть 3D-объект для вашего меча вместе с анимацией, вы можете добавить к нему коллайдер и включить его на время анимации свинга.

Вышесказанное будет очень точным, но это может быть не то поведение, которого вы на самом деле хотите. Если вы хотите, чтобы игрок использовал что-то более «простое», вы можете добавить отдельный объект со сферическим коллайдером перед игроком. И точно так же вы включили бы его на время анимации или, может быть, даже на долю секунды.

Вероятно, еще лучшим подходом было бы использовать SphereCast в вашем коде, чтобы выполнить проверку «момент времени» для области перед плеером. Пример кода из документов, немного измененный:

 void Attack()
{
    RaycastHit hit;

    // _hitCenterGameObject would be a GameObject you would create under your character GameObject. Position it wherever you want the hit to be centered
    // This makes it really easy to see and understand where your attack will be in relation to you character
    var spherePosition = _hitCenterGameObject.position;
    
    // How big is the sphere going to be
    var radius = 1f;

    float distanceToObstacle = 0;

    // Cast a sphere to see if it we hit anything.
    if (Physics.SphereCast(spherePosition, radius, transform.forward, out hit, 10))
    {
        // You got a hit, probably want to figure out what it is, and whether or not to apply damage.
        distanceToObstacle = hit.distance;
    }
}
 

Примечание: Вы можете захотеть использовать SphereCastAll , так как он вернет все объекты, пораженные радиопередачей. Или, может быть, вы изменили бы это в зависимости от типа оружия или атаки. Может быть, удар может поразить несколько целей, в то время как удар может поразить только одну? Просто одна мысль.