[英]How do I fix this script for Unity 3D
该脚本应该允许我的第一人称控制器/播放器 go 到 object,按 E 键然后拿起并随身携带 object。 脚本中有错误,我还不明白如何编程。 我还附上了代码中错误的屏幕截图以供参考。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PickupObject : MonoBehaviour
{
GameObject mainCamera;
bool carrying;
GameObject carriedObject;
public float distance;
public float smooth;
// Start is called before the first frame update
void Start()
{
mainCamera = GameObject.FindWithTag("MainCamera");
}
// Update is called once per frame
void Update()
{
if (carrying)
{
carry(carriedObject);
checkDrop();
}
else
{
pickup();
}
}
void carry(GameObject o)
{
o.GetComponent<Rigidbody>().isKinematic = true;
o.transform.position = Vector3.Lerp (mainCamera.transform.position + mainCamera.transform.forward * distance, Time.deltaTime * smooth);
}
void pickup()
{
if (Input.GetKeyDown KeyCode.E;))
{
int x = Screen.width / 2;
int y = Screen.height / 2;
}
Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
Pickupable p = hit.collider.GetComponent<Pickupable>();
if(p != null)
{
carrying = true;
carriedObject = p.gameObject;
p.gameObject.rigidbody.isKinematic = true;
}
}
}
}
void checkDrop()
{
if(Input.GetKeyDown(KeyCode.E))
{
dropObject();
}
void dropObject()
{
carrying = false;
carriedObject = null;
carriedObject.gameObject.rigidbody.isKinematic = false;
}
}
}
也许您应该尝试使用 Raycast 来拾取物品。 创建一个“Pick Up”标签,将该标签添加到所有可拾取物品,如果玩家按下“E”,则从相机向相机方向发射 Raycast,检查命中是否有标签,然后将其拾取. 搜索“Raycast 教程”,你会发现很多结果。
在pickup
中,您在if
块中定义int x
和int y
。
第二个问题是在pickup
方法之内(或之后)你有一个关闭}
到很多。
if (Input.GetKeyDown KeyCode.E;))
{
int x = Screen.width / 2;
int y = Screen.height / 2;
} // <-- SEEMS THAT THIS HERE IS YOUR PROBLEM !
所以你基本上在方法 checkDrop 之前结束你的checkDrop
。 rest 只是后续错误: x
和y
仅在此代码块中是已知的,当您稍后尝试在
Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));
它们不存在。
也正如您和 class 所说的那样,方法checkDrop
在Update
中是未知的。 然后你会得到一些额外的错误,因为不允许在类型之外定义方法。
请注意,我格式化了您的代码,所以现在应该很清楚了。 你可能更希望它做
void pickup()
{
if (Input.GetKeyDown KeyCode.E;))
{
int x = Screen.width / 2;
int y = Screen.height / 2;
Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
Pickupable p = hit.collider.GetComponent<Pickupable>();
if(p != null)
{
carrying = true;
carriedObject = p.gameObject;
p.gameObject.rigidbody.isKinematic = true;
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.