C# 试图通过光线向我的十字线方向投掷物品

C# 试图通过光线向我的十字线方向投掷物品,c#,unity3d,C#,Unity3d,我已经尝试了5天多了。。。 我试图在第三人称模式下制作一个简单的机械装置,它允许我将我的物品扔到屏幕中央,我的十字线(十字线)所在的位置。。。我使用的是cinemachine,甚至只有当我的第二个“瞄准”摄像头被激活时,我才试图简化这个机制。。。 但它仍然不想把物品完全扔到十字线上。。我试着制作raycast的命中功能,但它不起作用。该项目只是流动的方向,而不是十字瞄准所有。。。(它可能朝着相机的方向流动,但不是十字线的方向) 以下是我为光线投射和投掷功能编写的代码: if (ObjectIwa

我已经尝试了5天多了。。。 我试图在第三人称模式下制作一个简单的机械装置,它允许我将我的物品扔到屏幕中央,我的十字线(十字线)所在的位置。。。我使用的是cinemachine,甚至只有当我的第二个“瞄准”摄像头被激活时,我才试图简化这个机制。。。 但它仍然不想把物品完全扔到十字线上。。我试着制作raycast的命中功能,但它不起作用。该项目只是流动的方向,而不是十字瞄准所有。。。(它可能朝着相机的方向流动,但不是十字线的方向) 以下是我为光线投射和投掷功能编写的代码:

if (ObjectIwantToPickUp)


        {
            Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * 100, Color.red);
            RaycastHit hit;
            Vector3 hitPos;
            if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit))
            {
                hitPos = hit.point;
            }
            else
            {
                hitPos = Camera.main.transform.position + Camera.main.transform.forward * 99;
            }


         forceDirection = hitPos - ObjectIwantToPickUp.transform.position;
    }
这里是投掷的:

void throwObject()
        {
            if (hasItem == true && Input.GetKeyDown("t"))
            {
                BoxCollider[] bc = ObjectIwantToPickUp.GetComponents<BoxCollider>();
                foreach (BoxCollider b in bc)
                {
                    b.enabled = true;
                }
                ObjectIwantToPickUp.GetComponent<BoxCollider>().enabled = true;
                ObjectIwantToPickUp.GetComponent<Rigidbody>().isKinematic = false; // make the rigidbody work again
                //ObjectIwantToPickUp.GetComponent<Rigidbody>().useGravity = false; // make the rigidbody work again
                hasItem = false;
 
                ObjectIwantToPickUp.transform.parent = null; // make the object no be a child of the hands
                ObjectIwantToPickUp.GetComponent<Rigidbody>().AddForce(forceDirection.normalized * 15, ForceMode.Impulse);
                ObjectIwantToPickUp.GetComponent<Rigidbody>().AddTorque(ObjectIwantToPickUp.transform.TransformDirection(Vector3.right) * 100, ForceMode.Impulse);
             
            }
void throwObject()
{
if(hasItem==true&&Input.GetKeyDown(“t”))
{
BoxCollider[]bc=ObjectWantToPick.GetComponents();
foreach(bc中的BoxCollider b)
{
b、 启用=真;
}
ObjectWantToPick.GetComponent().enabled=true;
ObjectWantToPick.GetComponent().IsKinetic=false;//使刚体再次工作
//ObjectWantToPick.GetComponent().useGravity=false;//使刚体再次工作
hasItem=false;
ObjectWantToPick.transform.parent=null;//将对象no设置为手的子对象
objectWantToPick.GetComponent().AddForce(forceDirection.normalized*15,ForceMode.Pulse);
ObjectWantToPick.GetComponent().AddTorque(ObjectWantToPick.transform.TransformDirection(Vector3.right)*100,ForceMode.Pulse);
}
以下是完整的脚本,以防我遗漏了什么: 请给我一个提示,我哪里错了。 我使用的cinemachine有两个摄像头和一个主摄像头,其中包含大脑组件。 此外,我正在使用一个defineposition脚本,其中包含两个简单的Vector3位置。 我使用它是因为我需要将拾取的项目精确地设置在我手中预定义的位置

我有两个摄像头:自由外观摄像头和虚拟摄像头(用于瞄准),我通过以下脚本更改它们以更改优先级:

以下是一段不起作用的简短视频:

如你所见,场景中的“棍子”在投掷时与十字线不匹配


如果我不够清楚,请原谅,对于混乱的代码:D

问题在于
摄影机。main
为您提供自由外观摄影机的前进方向和位置。您需要获取虚拟摄影机的变换位置和前进方向,然后改为使用它们

首先,添加一个可以在检查器中指定目标摄影机的字段:

[SerializeField] Cinemachine.CinemachineVirtualCameraBase aimCam;
那么对于光线:

Vector3 aimOrigin = aimCam.State.FinalPosition; 
Vector3 aimDir = aimCam.State.FinalOrientation * Vector3.forward;
然后你可能想要增加一些垂直力,这样它在撞击地面之前会移动一点:

AddForce(forceDirection.normalized * 30f + Vector3.up * 10f, ForceMode.Impulse);

…或者你可以在物体的刚体上禁用重力。但是它可能永远不会撞到地面,因此你的里程数可能会随之变化。

顺便说一下,你可以使用
AddRelativeTorque(Vector3.right*100,ForceMode.pulse)
另外,您应该避免调用
GetComponent
太多次,尤其是在调用频率很高的方法中。将结果保存在字段中,使用该字段,必要时进行更新。@Ruzihm嘿,感谢您的快速响应!我尝试添加了此方法,结果是在暂停时,我得到了很多未分配的引用异常错误,但在开始拾取项目时,我得到以下结果:我尝试使用ObjectWantToPick.GetComponent().AddRelativeTorque(Vector3.right*100,ForceMode.Pulse);而不是我的,但什么都没有发生。我制作了一个简单的脚本,定义了我在手中的位置,但我需要每个游戏对象的值,这样我就可以这样调用脚本:(我想不出更好的解决方案,从屏幕截图上可以看出,我的光线没有指向我的十字线指向的地方:(你认为GetComponent方法会影响我的性能吗?有没有聪明的方法可以做到这一点?非常感谢你能告诉我如何获得虚拟相机的变换位置和前进方向?我真的对cinemachine的特性感到困惑。非常感谢你的建议!!!!我能够制作光线f从瞄准照相机(我想)但现在我唯一的问题是,当我抛出项目时,它根本不会朝着十字线的方向向上。也许它只是朝着相机的方向。这是视频:这是我的代码:请告诉我我的错误在哪里。另外,我可以把两个向量都放在开始位置吗?或者它们必须像现在一样处于更新状态?非常感谢!!!嘿!:)我想知道,是否有可能从我用于“十字线”的十字线画布上获取光线在我的cinemachine Aim相机中,不是从相机本身?我认为如果我可以将项目直接扔到十字线指向的位置,投掷会更加准确?这可能吗?现在,我的Aim相机附带了一个简单的脚本,并在按下按钮后将其激活。当Aim相机激活时,十字线将打开我当前投掷功能的视频:逻辑- @月球骑士可能会更好地问一个单独的问题;然后你可以发布更多关于那里的情况。考虑回这个帖子,并解释为什么它是不同的。