Unity - Как рассчитать новую позицию для объекта по высоте другого объекта в 3D - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы рассчитать новую позицию на основе шага me sh, чтобы сделать объект, следующий за вершиной моего объекта, который вращается:

first_img

И результат:

second_img

Я не могу сделать квадратный объект, представленный выше, как дочерний (в иерархия объектов Unity) линейного объекта, потому что повернутый объект может видеть, что его масштаб изменяется в любое время.

Можно ли использовать математическое решение в этом случае?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Горячие точки

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

Что такое горячая точка?

Отредактируйте целевой игровой объект (в данном случае строку) и добавьте к нему пустой игровой объект. Дайте ему какое-то подходящее имя - например, «точка пересечения оружия», а затем переместите его в то место, где вы хотели бы, чтобы другой объект игры был выбран. По сути, горячая точка - это просто пустой игровой объект - своего рода маркер размещения.

Как его использовать?

Все, что вам нужно, - это ссылка на игровой объект горячей точки. Вы можете сделать это, добавив небольшой скрипт к игровому объекту полюса, который отслеживает его для вас:

public class PowerPole : MonoBehaviour {
    public GameObject CrossArmsHotspot; // Set this in the inspector
}

Затем вы можете получить ссылку на эту точку доступа из любого экземпляра полюса питания, подобного этому:

var targetHotspot = aPowerPoleGameObject.GetComponent<PowerPole>().CrossArmsHotspot;

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

void Start(){
   targetHotspot = aPowerPoleGameObject.GetComponent<PowerPole>().CrossArmsHotspot;
}

void Update(){
    transform.position = targetHotspot.transform.position;
}

будет (упрощенным) примером.

Более продвинутый пример, использующий lerp для перемещения к горячей точке:

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

public class CrossArmsMover : MonoBehaviour
{
    public GameObject PowerPole;
    private GameObject targetHotspot;
    public GameObject CrossArms;
    public float TimeToTake = 5f;
    private float timeSoFar;
    private Vector3 startPosition;
    private Quaternion startRotation;


    // Start is called before the first frame update
    void Start()
    {
        startPosition = CrossArms.transform.position;
        startRotation = CrossArms.transform.rotation;
        targetHotspot = PowerPole.GetComponent<PowerPole>().CrossArmsHotspot;
    }

    // Update is called once per frame
    void Update()
    {
        timeSoFar+=Time.deltaTime;

        var progress = timeSoFar/TimeToTake;

        // Clamp it so it doesn't go above 1.
        if(progress > 1f){
            progress = 1f;
        }

        // Target position / rotation is..
        var targetPosition = targetHotspot.transform.position;
        var targetRotation = targetHotspot.transform.rotation;

        // Lerp towards that target transform:
        CrossArms.transform.position = Vector3.Lerp(startPosition, targetPosition, progress);
        CrossArms.transform.rotation = Quaternion.Lerp(startRotation, targetRotation, progress);

    }
}

Using Lerp whilst moving the target object around

0 голосов
/ 10 февраля 2020

Вам нужно было бы поставить скрипт на следующий игровой объект, в который вы бы поместили:

GameObject pitcher = //reference to the gameobject with the pitch;

const int DISTANCE_ON_LINE = //distance between the 2 objects

void Update() {
    transform.position = pitcher.transform.position + pitcher.transform.forward * DISTANCE_ON_LINE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...