朝向相反方向移动物体

时间:2014-09-15 18:32:21

标签: unity3d unityscript

基本上我试图让我的角色在相机朝向的方向上向前冲一个特定的距离。这个fps和我能够做到的最好的面孔是在全局X轴上前进,这显然是错误的。

我有这个函数,它是从更新函数调用的:

Debug.Log("We are dashing.");

    if (!inputDash || !canControl)
        dashing.lastButtonDownTime = -100;

    if (inputDash && dashing.lastButtonDownTime < 0 && canControl)
        dashing.lastButtonDownTime = Time.time;

    if (dashing.enabled && canControl && (Time.time - dashing.lastButtonDownTime < 0.2))
    {            
        dashing.dashing = true;
        dashing.lastButtonDownTime = -100;
        dashing.dashCounter ++;

        dashing.dashDir = Camera.mainCamera.transform.position;

        //velocity = Vector3.MoveTowards(dashing.dashDir, (dashing.dashDir + Vector3(dashing.dashDir.x + 2, 0, 0)), (2 * Time.deltaTime));

        Debug.Log("We just dashed.");            
    }       

    return velocity;

我为dashing.dashDir尝试了许多不同的东西,但没有一个有效。我知道我基本上想要在相机的局部轴上划线?

我也试过这个:

dashing.dashDir = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));            
velocity += dashing.dashDir * dashing.baseDistance;

任何帮助都会非常感激,因为这让我感到疯狂。

最后一点。我希望在朝向的方向上快速向前冲击玩家大约3米,然后在破折号结束时进入速度。对不起,如果不清楚的话。

2 个答案:

答案 0 :(得分:0)

要沿局部轴移动对象,您需要使用该对象转换,如此

dir = Camera.mainCamera.transform.forward;

如果您还想添加当前速度,则需要像这样使用

newVelocity = Camera.mainCamera.transform.forward * (baseSpeed + currectVelocity.magnitude);

这将设置摄像机向前的方向,并将baseSpeed添加到当前速度。

如果您想设置距离而不是速度,可以像这样计算

speed = distance / time;

这是你想要旅行的距离以及破折号的持续时间。如果你这样做我就不会把它添加到当前的速度,因为这会改变行进的距离。

答案 1 :(得分:0)

这是我的答案,它完美地运作:前进,旋转和碰撞其他物体(有RigidBody和Box / Capsule Collider)。这是基于伯克哈德的回答。

但是要做到这一点:创建一个空对象,将其设置为播放器的子对象,并将摄像机对象拖动到空对象中。

  

注意:您可以将相机放在播放器后面以获得最佳视野。

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

  public class CubeControl : MonoBehaviour {

    public float speed = 10.0f;
    Rigidbody rb;
    GameObject playerEmpty;
    // Use this for initialization
    void Start () {

        rb = GetComponent<Rigidbody> ();

    }

    // Update is called once per frame
    void Update () {

        float Haxis = Input.GetAxis ("Horizontal");
        float Vaxis = Input.GetAxis ("Vertical");


        //Go Forward
        if(Input.GetKeyDown(KeyCode.UpArrow))
            {

                //Works perfectly but does no longer collide
                //rb.transform.position += transform.forward * Time.deltaTime * 10.0f;
               //Not moving in the right direction
                //rb.velocity += Vector3.forward * 5.0f;


              rb.velocity += Camera.main.transform.forward * speed;

            //rb.rotation() += new Vector3 (0.0f, headingAngle, 0.0f) * 5.0f;
            //rb.velocity += gameObject.transform.localEulerAngles * Time.deltaTime * 10.0f ; 
            }
        if(Input.GetKeyDown(KeyCode.DownArrow))
            {
                rb.velocity -= Camera.main.transform.forward * speed;
            }    
            Vector3 rotationAmount = Vector3.Lerp(Vector3.zero, new Vector3(0f, 10.0f * (Haxis < 0f ? -1f : 1f), 0f), Mathf.Abs(Haxis));
            Quaternion deltaRotation = Quaternion.Euler(rotationAmount * Time.deltaTime);
            this.transform.rotation = (this.transform.rotation * deltaRotation);

    }
}