Повернуть твёрдое тело с помощью поворота в направлении камеры - PullRequest
0 голосов
/ 01 мая 2020

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

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

public class movimento : MonoBehaviour
{

   [SerializeField] float walk = 1;
   [SerializeField] float run = 2;
    Vector3 movement = Vector3.zero;
    private Rigidbody rig;

    // Start is called before the first frame update
    void Start()
    {
      rig = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift)) walk = (walk + run);
        if (Input.GetKeyUp(KeyCode.LeftShift)) walk = (walk - run);

        float Horizontal = Input.GetAxis("Horizontal");.
        float Vertical = Input.GetAxis("Vertical");
        movement = Camera.main.transform.forward * Vertical + Camera.main.transform.right * Horizontal;
        float origMagnitude = movement.magnitude;
        movement.y = 0f;
        movement = movement.normalized * origMagnitude;

    }

     private void FixedUpdate ()
    {
        rig.MovePosition(rig.position + movement * walk * Time.fixedDeltaTime);
        Quaternion rotation = Quaternion.Euler(???);
        rig.MoveRotation(rig.rotation * rotation);


    }
  }`

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

Я создал лучевую трансляцию с камеры, и я хотел бы повернуть твёрдое тело туда, куда указывает лучевая трансляция, но если я запускаю единицу, он вращается дико. В чем ошибка?

     Vector3 direction;
  Vector3 rayDir = new Vector3(Screen.width/2,Screen.height/2);

void Update()

Ray ray = Camera.main.ScreenPointToRay(rayDir);
        Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);
RaycastHit hit = new RaycastHit ();
direction = hit.point - transform.position;

private void FixedUpdate ()
Quaternion rotation = Quaternion.LookRotation(direction);
  rig.MoveRotation(rig.rotation * rotation);
0 голосов
/ 02 мая 2020

Добавьте компонент контроллера персонажа, это то, для чего. См .:

https://docs.unity3d.com/Manual/class-CharacterController.html

0 голосов
/ 01 мая 2020

Я использую сопрограмму, чтобы сделать плавное вращение. Я использую Quaternion.LookRotation для задания.

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

StartCoroutine(SmoothRotation(Camera.main.transform, 3f));
:
:

IEnumerator SmoothRotation(Transform target, float duration)
{
    float currentDelta = 0;
    var startrotation = transform.rotation;//use your rigisbody if you want here i use the gameobject
    var LookPos = target.position - transform.position;
    var finalrot = Quaternion.LookRotation(LookPos);


    while (currentDelta <= 1f)
    {
        currentDelta += Time.deltaTime / duration;
        transform.rotation = Quaternion.Lerp(startrotation, finalrot, currentDelta);//
        yield return null;
    }

    transform.rotation = finalrot;
}

, если вы хотите видеть (в сцене во время бега), где точки вашей камеры просто добавляют эту строку кода в update ():

    Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.TransformDirection(Vector3.forward) * 10f, Color.black);

если вы хотите указать в том же направлении, что и камера, просто измените линию финального рычага в методе SmoothRotation:

var finalrot = Camera.main.transform.rotation;

вам не нужно вычислять LookPos

для вашей задачи сумасшедшего вращения, я предлагаю вам сбросить вращение x и z

direction = hit.transform.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(direction);
rotation.x = 0f;
rotation.z = 0f;

советы по обнаружению того, что вы хотите, с помощью raycast внутри spere: Physics.OverlapSphere : вы можете выбрать что вы хотите использовать при использовании необязательного параметра layermask

private void DetectEnemy(Vector3 center, float radius)
{

    var hitColliders = Physics.OverlapSphere(center, radius );

    for (var i = 0; i < hitColliders.Length; i++)
    {
        print(hitColliders[i].name + "," + hitColliders[i].transform.position);
        // collect information on the hits here
    }
}
...