Как установить цель преобразования в префаб? - PullRequest
0 голосов
/ 13 марта 2019

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

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Как сказано, ты не можешь.

Префабы живут в активах, и вы просто не можете иметь ссылки на сцены в активах. (Между прочим, такая же проблема существует для AnimatorController)

Однако существует множество способов получения ссылок во время выполнения.


ScriptableObject

Используйте ScriptableObject для хранения ссылки и используйте соответствующий компонент Setter для соответствующего преобразования GameObject в сцене.

[CreateAssetMenu(fileName = "TransformReference", menuName = "SceneReferences/Transform", order = 1)]
public class ScriptableTransformReference : ScriptableObject 
{
    public Transform value; 
}

В ProjectView (активы) выполните щелчок правой кнопкой мыши -> Создать -> SceneReferences -> Преобразовать, чтобы создать новый экземпляр ScriptableTransformReference.

А чем на вашем плеере есть этот сеттер

// By adding ExecuteInEditMode this is already executed 
// without entering PlayMode
[ExecuteInEditMode]
public class TransformReferenceSetter : MonoBehaviour
{
    // Reference the created ScriptableObject here via the Inspector
    public ScriptableTransformReference TargetScriptableObject;

    private void Awake()
    {
        TargetScriptableObject.value = transform;
    }
}

Тогда, когда вам понадобится эта ссылка в другом компоненте, просто снова сделайте поле

// Reference this in the Inspector
public ScriptableTransformReference SourceScriptableObject;

и получите доступ к value .., чтобы быть уверенным в Start, так что сеттеры Awake уже были выполнены. На этот раз вы можете иметь ссылку в префабе, поскольку ScriptableObject также находится в активах.


Найти

Вы можете использовать Find, чтобы получить объект по имени и сделать, например,

var playerTransform = Find("Player").transform;

но я бы порекомендовал не использовать это .. никогда. Это высокая производительность, и если вы когда-либо измените имя GameObject, это тормозит ваш код. Он также работает только для поиска GameObject, который активен в иерархии thw в момент его выполнения.


* * FindObjectOfType тысяча сорок-девять

Однако, если в любом случае есть только один игрок, создайте специальный класс для игрока, как

public class Player : MonoBehaviour {}

это ничего не должно делать. Теперь вы можете просто использовать FindObjectOfType<Type>() для получения справки, которая является более эффективной и надежной

var playerTransform = FindObjectOfType<Player>().transform;

в любых других компонентах Сцены (например, после создания сборного). Но опять же, это также работает, только если соответствующий GameObject и компонент активны и включены в иерархии в тот момент, когда это выполняется.


Singleton

Или (ab) использовать шаблон Singleton

public class Player : MonoBehaviour 
{
    public static Player Singleton;

    private void Awake ()
    {
        Singleton = this;
    }
}

и используйте

var playerTransform = Player.Singleton.transform;

где-нибудь еще.


Внедрение зависимостей

Возможно, вы захотите войти в Zenject или аналогичные виды внедрения зависимостей. Хотя это немного более полно для его настройки, но после того, как он заработает, он станет очень мощным инструментом для предоставления ссылок даже в различных сценах и на основе контекста.

0 голосов
/ 14 марта 2019

Используйте Projectile Motion

Это не полный ответ, вы просто решаете его, меняя вещи, это будет весело.

var pos = Vector3.MoveTowards(transform.position, _target.transform.position , _projectileSpeed * Time.deltaTime);
  rigidbody.MovePosition(pos);

попробуйте сtransform.LookAt(targetXZPos); чтобы кончик раковины указывал на цель.

Если этот код не дал требуемого результата, вам следует рассмотреть Скорость запуска, Угол запуска, Расстояние до цели и заставить формулу снаряда работать, немного большежесткая, но создаст больше оригинальности и даст игроку более интересное ощущение углов (если требуется), скорость запуска может быть постоянной на основе разных снарядов (что опять-таки хорошая идея продавать снаряды с разным радиусом действия игрокам).

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