Активация анимации в радиусе действия - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать сценарий для моей вражеской турели, но у меня ничего не получается. У меня есть несколько анимаций активации и деактивации турели. Мне нужно, чтобы в зависимости от расстояния от игрока воспроизводилась любая анимация. Таким образом, как только он перемещается в радиусе обнаружения, он воспроизводит анимацию активации, а когда он выходит за пределы, он воспроизводит анимацию деактивации. Большинство других способов, которые я пытаюсь использовать, требуют от меня создания контроллера анимации, в использовании которого у меня мало опыта. Мне нужен простой способ воспроизвести одну анимацию, когда она находится внутри, и воспроизвести другую, когда она находится снаружи. Я думаю, что был способ сохранить анимационный клип в сценарии, а затем воспроизвести его. Я прикрепил свой текущий сценарий, поэтому вы понимаете, о чем я.

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

public class EnemyTurret : MonoBehaviour
{
public GameObject Player;
public float DistanceToPlayer;
public float DetectionRadius = 75;
// Start is called before the first frame update
void Start()
{
    Player = GameObject.FindGameObjectWithTag("PlayerTank");
}

// Update is called once per frame
void Update()
{
    DistanceToPlayer = Vector3.Distance(transform.position, Player.transform.position);
    if (DistanceToPlayer<=DetectionRadius)
    {
        Debug.Log("Within Radius");
    }
    if (DistanceToPlayer >= DetectionRadius)
    {
        Debug.Log("Outside Radius");
    }
}

}

1 Ответ

0 голосов
/ 11 июля 2020

Расчет и проверка расстояния до игрока для каждого обновления () не идеален. Он будет работать, но он будет делать больше, чем нужно, когда игрока даже нет рядом. Это неэффективно.

Что вы можете сделать, если ваш игрок - Rigidbody, так это добавить SphereCollider к турели, установить isTrigger = true, установить радиус как радиус обнаружения и обработать OnTriggerEnter ( ) и OnTriggerExit () для воспроизведения или остановки анимации.

Вы также можете добавить в скрипт два объекта publi c Animation, перетащить анимацию в редактор, затем вы можете использовать анимацию. ) и .Stop () et c. для управления анимацией.

Что-то вроде этого. Не тестировалось полностью, но вы можете понять идею.

public float detectionRadius = 75;
public Animation activateAnimation;
public Animation deactivateAnimation;

void Start()
{
    SphereCollider detectionSphere = gameObject.AddComponent<SphereCollider>();
    detectionSphere.isTrigger = true;
    detectionSphere.radius = detectionRadius;
    detectionSphere.center = Vector3.zero;
}

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "PlayerTank")
    {
        activateAnimation.Play();
    }
}

private void OnTriggerExit(Collider other)
{
    if (other.gameObject.tag == "PlayerTank")
    {
        deactivateAnimation.Play();
    }
}

Ваша анимация не должна быть l oop в противном случае вам придется добавить еще c logi, чтобы проверить, есть ли animation.isPlaying, и создать свою собственную анимацию .Stop () et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...