沿着摄像机的方向旋转刚体。

问题描述 投票:0回答:3

我想使用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);


    }
  }`
c# unity3d rotation quaternions direction
3个回答
0
投票

我用一个coroutine来做平滑旋转。我使用 四元数.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方法中修改finalrot一行。

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;

一个提示,以检测你想要的对象与射线广播里面的spere.OverlapSphere。Physics.OverlapSphere:你可以在使用可选的参数时选择你想投的东西。敷面膜

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
    }
}

0
投票

我从相机中创建了一个射线广播,我想将刚体旋转到射线广播指向的地方,但如果我启动unity,它就会疯狂地旋转。错误是什么?

     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
投票

添加一个角色控制器组件,这是什么原因。请看。

https:/docs.unity3d.comManualclass-CharacterController.html。

© www.soinside.com 2019 - 2024. All rights reserved.