让GameObject悬停在飞机上方? - Unity3D C#

时间:2016-06-22 16:07:51

标签: c# unity3d

所以我正在尝试制作FPS型游戏,是否有可能将游戏对象锁定在Y轴上/无法向上或向下移动? GameObject是来自Counter Strike的AWP的模型,我使用WASD键在飞机上移动,当我使用鼠标向上/向下查看时,AWP对角线到我正在看的地方,而我不要那样。我的游戏看起来像这样:Screenshot

如果有帮助,这是我为AWP提供的代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class AWPscript : MonoBehaviour {
public float speed = 5f;
// public float sensitivityX = 15.0f;
// public float sensitivityY = 15.0f;
public Camera MainCamera;
public Camera scopeCamera;
public float lookSensitivity = 10f;
public float xRotation ;
public float yRotation ;
public float currentXRotation;
public float currentYRotation;
public float xRotationV;
public float yRotationV;
public GameObject Scopepng;
public float lookSmoothDamp = 0.1f;
public Image ScopePNG;
public AudioClip sound;
// Use this for initialization
void Start () {
    speed = 7.5f;
}

// Update is called once per frame
void Update () {
    if(Input.GetKey(KeyCode.W))
    transform.Translate(Vector3.forward * Time.deltaTime*speed);
    if (Input.GetKey(KeyCode.S))
        transform.Translate(Vector3.back * Time.deltaTime * speed);
    if (Input.GetKey(KeyCode.A))
        transform.Translate(Vector3.left * Time.deltaTime * speed);
    if (Input.GetKey(KeyCode.D))
        transform.Translate(Vector3.right * Time.deltaTime * speed);

    if (Input.GetKey(KeyCode.LeftControl))
        speed = 15f;



    lookAround();
     scope();
}

void scope()
{
    if (Input.GetMouseButton(1))
    {

        MainCamera.enabled = false;
        scopeCamera.enabled = true;
        ScopePNG.enabled = true;

    }
    else
    {

        MainCamera.enabled = true;
        scopeCamera.enabled = false;
        ScopePNG.enabled = false;

    }
}
void lookAround()
{
    xRotation -= Input.GetAxis("Mouse Y") * lookSensitivity;
    yRotation += Input.GetAxis("Mouse X") * lookSensitivity;
    transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);
}
}

2 个答案:

答案 0 :(得分:2)

这可能是最简单的解决方案:

void Update () {
    if(Input.GetKey(KeyCode.W))
    transform.Translate(Vector3.forward * Time.deltaTime*speed);
    if (Input.GetKey(KeyCode.S))
        transform.Translate(Vector3.back * Time.deltaTime * speed);
    if (Input.GetKey(KeyCode.A))
        transform.Translate(Vector3.left * Time.deltaTime * speed);
    if (Input.GetKey(KeyCode.D))
        transform.Translate(Vector3.right * Time.deltaTime * speed);

    if (Input.GetKey(KeyCode.LeftControl))
        speed = 15f;

    LookAround();
    Scope();

    JoeFix();
    }

public float fixedFloatingHeightMeters; // set to say 1.4 in the editor
private void JoeFix()
   {
   Vector3 p = transform.position;
   p.y = fixedFloatingHeightMeters;
   transform.position = p;
   }

PS!你真的必须将lookAround重命名为LookAround并将范围重命名为Scope。它会影响以后的事情

这是一种可能更符合您需求的高级信息。请试一试!

目前你有一个向量是指向对象的鼻子。

说事情朝北,好吗?

所以,transform.forward指向北方,但它指向“下降位”。

虽然它指向北方,如果你从侧面看到它的向量指向DOWN A BIT。

你真正想要的是那个向量,但是FLAT,而不是指向下或向上。对不对?!

事实上,这就是魔术:

Vector3 correctDirectionButPossiblyDownOrUp = transform.forward;
Vector3 correctDirectionButFlatNoDownOrUp;
correctDirectionButFlatNoDownOrUp
 = Vector3.ProjectOnPlane(
     correctDirectionButPossiblyDownOrUp,
     Vector3.up );
correctDirectionButFlatNoDownOrUp.Normalize();

correctDirectionButFlatNoDownOrUp 现在是您想要的“神奇”矢量。

但是,不要忘记Translate在LOCAL SPACE中工作。 (“对象”的世界观。)你非常想在世界空间中移动它,这很容易。注意最后一个参数:https://docs.unity3d.com/ScriptReference/Transform.Translate.html

transform.Translate(
    correctDirectionButFlatNoDownOrUp * Time.deltaTime*speed,
    Space.World);

就是这样!

脚注不要忘记“Vector3.up”与“Vector3”完全没有关系。

答案 1 :(得分:0)

如果您不需要重力,那么移除RigidBody组件将停止Unity施加重力并且它将悬停。