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

标签 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);
}
}

最佳答案

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

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。它可以影响以后的事情


这是一条高级信息,可能更符合您的需要。请也试试这个!

目前你有一个矢量,它是指向物体的 Nose 。

假设它正在向北移动,好吗?

所以,transform.forward指向北方,但指向“向下一点”。

虽然它指向北方,但如果您从侧面看它,矢量指向下方一点。

您真正想要的是那个矢量,但它是平的,而不是指向下方或上方。对吧?!

事实上,这是做到这一点的魔法:

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”完全没有关系。

关于c# - 让 GameObject 悬停在飞机上方? - Unity3D C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973229/

相关文章:

c# - 有没有办法实时查看 sql server 从我的应用程序接收的查询语句?

c# - Asp.net C# 的 PayPal RestApi 身份服务不返回正确的 url

unity3d - 单击按钮时的麦克风录音

android - 构建播放器时出错 : IOException: Failed to Move File

c# - 以编程方式设置和保存与导入 Assets 关联的图标

c# - 这段异步代码有什么问题?

c# - 如何重写数据集中表上的 TableAdapter 方法?

c# - 我在哪里可以下载 PEVerify.exe 工具?

c# - 无法使用 JsonUtility 在 Unity 5.4 中反序列化 JSON。子集合始终为空

FFMpeg 连续实时图像到视频编码