C# 如何修复Unity 3D的此脚本
该脚本应该允许我的第一人称控制器/播放器进入一个对象,按下E键,然后拾取并携带该对象。脚本中有错误,我还不知道如何编程。我还附上了代码中错误的截图以供参考C# 如何修复Unity 3D的此脚本,c#,unity3d,game-development,C#,Unity3d,Game Development,该脚本应该允许我的第一人称控制器/播放器进入一个对象,按下E键,然后拾取并携带该对象。脚本中有错误,我还不知道如何编程。我还附上了代码中错误的截图以供参考 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PickupObject : MonoBehaviour { GameObject mainCamera; bool carrying;
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;
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类PickupObject:单行为
{
游戏机;
布尔携带;
游戏对象承载对象;
公众浮标距离;
公共交通畅通;
//在第一帧更新之前调用Start
void Start()
{
mainCamera=GameObject.FindWithTag(“mainCamera”);
}
//每帧调用一次更新
无效更新()
{
如果(携带)
{
携带(携带对象);
checkDrop();
}
其他的
{
拾音器();
}
}
空携带(游戏对象o)
{
o、 GetComponent().IsKinetic=true;
o、 transform.position=Vector3.Lerp(mainCamera.transform.position+mainCamera.transform.forward*距离、时间、延迟时间*平滑);
}
无效拾取()
{
if(Input.GetKeyDown KeyCode.E;))
{
int x=屏幕宽度/2;
int y=屏幕高度/2;
}
Ray Ray=mainCamera.GetComponent().ScreentPointToRay(新矢量3(x,y));
雷卡斯特击中;
如果(物理.光线投射(光线,出击))
{
Pickupable p=hit.collider.GetComponent();
如果(p!=null)
{
携带=正确;
carriedObject=p.gameObject;
p、 gameObject.rigidbody.IsKinetic=true;
}
}
}
}
void checkDrop()
{
if(Input.GetKeyDown(KeyCode.E))
{
dropObject();
}
void dropObject()
{
携带=假;
carriedObject=null;
carriedObject.gameObject.rigidbody.IsKinetic=false;
}
}
}
也许您应该尝试使用光线投射来拾取项目。创建一个“拾取”标记,将该标记添加到所有可拾取的项目中,如果玩家按下“E”,则从相机向相机方向拍摄光线投射,检查命中是否有该标记,然后拾取。搜索“光线投射教程”,您将发现许多结果。在
拾取
中定义int x
和int y
在if
块中
第二个问题是,在拾取
方法内(或之后),您有一个非常接近的}
if (Input.GetKeyDown KeyCode.E;))
{
int x = Screen.width / 2;
int y = Screen.height / 2;
} // <-- SEEMS THAT THIS HERE IS YOUR PROBLEM !
它们不存在
同样,正如您和类所说的,因此方法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;
}
}
}
}
无效拾取()
{
if(Input.GetKeyDown KeyCode.E;))
{
int x=屏幕宽度/2;
int y=屏幕高度/2;
Ray Ray=mainCamera.GetComponent().ScreentPointToRay(新矢量3(x,y));
雷卡斯特击中;
如果(物理.光线投射(光线,出击))
{
Pickupable p=hit.collider.GetComponent();
如果(p!=null)
{
携带=正确;
carriedObject=p.gameObject;
p、 gameObject.rigidbody.IsKinetic=true;
}
}
}
}
我找到了答案,添加了一个新脚本,现在代码中没有错误,但我试图拾取的对象漂浮在空中,当我放开它们时不会掉落。我有一个刚体在那里,既有重力也有运动学,它不会上升,但会掉到地上。知道如何解决这个问题吗?即使你不完全理解,也要解决第一个问题,检查它,看看它现在说了什么。。等
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;
}
}
}
}