Горячие точки
Если вы хотите разместить что-то в определенном месте на обобщенном 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);
}
}