#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
, так как он вернет все объекты, пораженные радиопередачей. Или, может быть, вы изменили бы это в зависимости от типа оружия или атаки. Может быть, удар может поразить несколько целей, в то время как удар может поразить только одну? Просто одна мысль.