Unity Copy Movement base с наружной стороны - PullRequest
0 голосов
/ 28 апреля 2020

Пожалуйста, проверьте GIF, чтобы увидеть пример,

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

Ниже приведен код для воссоздания текущей ситуации, как показано на Gif. Я не мог обернуть свой ум вокруг, как решить это.

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

[ExecuteInEditMode]
public class CalculateMovement : MonoBehaviour
{
    [SerializeField] Transform MyOrigin;
    [SerializeField] Transform MyPosition;
    [SerializeField] Transform CopyCat;
    [SerializeField] Transform CopyCatOrigin;

    [SerializeField] float Distance;
    [SerializeField] Vector3 rawDirection;

    private void Update()
    {
        rawDirection = (MyPosition.position - MyOrigin.position).normalized;
        Distance = Vector3.Distance(MyOrigin.position, MyPosition.position);

        if (CopyCat)
        {
            CopyCat.position = rawDirection * Distance + CopyCatOrigin.position;
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.DrawLine(transform.position, transform.position + transform.forward);
        Gizmos.DrawLine(CopyCat.position, CopyCat.position + CopyCat.forward);
    }

}

y

1 Ответ

0 голосов
/ 28 апреля 2020

Это может не работать в режиме редактирования. Для позиции:

  1. Получить расстояние между lastPosition и текущим MyPosition
  2. Умножьте это расстояние на вперед MyCopy
  3. Добавьте это к текущей позиции MyCopy.

Для вращения:

  1. При запуске получить разницу между вращениями
  2. Установить MyCopy равным повороту MyPositions
  3. Повернуть MyCopy на основе Разница вращения на старте

Код:

public class question_61470495_unity_copy_movement : MonoBehaviour
{
    [SerializeField] Transform MyOrigin;
    [SerializeField] Transform MyPosition;
    [SerializeField] Vector3 MyPositionLastPos;
    [SerializeField] Transform CopyCat;
    [SerializeField] Transform CopyCatOrigin;

    [SerializeField] float Distance;
    [SerializeField] Vector3 rawDirection;
    [SerializeField] float diffRot;



    private void Start()
    {
        diffRot = Vector3.Angle(MyPosition.forward, CopyCat.forward);
        Debug.Log(diffRot);
        MyPositionLastPos = MyPosition.position;
    }

    private void Update()
    {
        CopyCat.position += CopyCat.forward * Vector3.Distance(MyPositionLastPos, MyPosition.position);

        CopyCat.rotation = MyPosition.rotation;
        CopyCat.Rotate(Vector3.up, diffRot);


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