c# - 如何为 Unity 3D 修复此脚本
问题描述
该脚本应该允许我的第一人称控制器/播放器上到一个对象,按 E 键,然后拾取并携带该对象。脚本中有错误,我还不明白如何编程。我还附上了代码中错误的屏幕截图以供参考。
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;
}
}
}
解决方案
在pickup
您定义的块内和int x
块内。int y
if
第二个问题是在方法之内(或之后)pickup
你有一个}
接近很多的方法。
if (Input.GetKeyDown KeyCode.E;))
{
int x = Screen.width / 2;
int y = Screen.height / 2;
} // <-- SEEMS THAT THIS HERE IS YOUR PROBLEM !
所以你基本上在方法之前结束你的课程checkDrop
。其余的只是后续错误:x
andy
将仅在此代码块中以及稍后尝试在其中使用它们时才知道
Ray ray = mainCamera.GetComponent<Camera>().ScreentPointToRay(new Vector3(x, y));
它们不存在。
也正如您和班级所说,该方法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;
}
}
}
}
推荐阅读
- bash - 使用 awk 和 bash 进行 vlookup:大数据速度慢
- android - 如何在 Android Studio 中自定义数据绑定字段?
- flutter - 如何使用flutter adyen支付网关?
- arrays - 将列值从 1 更改为 0
- html - 角材料扩展面板内的下拉菜单被切断
- reactjs - 反应警告:在 StrictMode 中不推荐使用 findDOMNode
- networking - 如何从主机访问 Kubernetes 集群?
- bash - 在 Bash 中,如何将字符串数字转换为二进制形式的 uint32_t,因为它存储在内存中?
- c# - 如何在事件处理程序 C# 中克隆列表
- flutter - 如何获取小部件的位置以便在加载时定位另一个小部件