C# 我试图用Unity制作一个FPS足球游戏,但我的脚本不是';行不通

C# 我试图用Unity制作一个FPS足球游戏,但我的脚本不是';行不通,c#,unity3d,C#,Unity3d,所以,我试图从头开始创造一场足球比赛。。。到目前为止,我所做的就是把球摆好。这就是我希望它的工作原理:当球员与球碰撞时,球向前跳一点。如果你开始跑动,球会被推得更远 现在,这里是我的球脚本(我使用标准FPS控制器作为角色): 使用UnityEngine; 使用系统集合; 公共类BallController:单行为{ 私人刚体; 公共游戏对象角色; 公共浮动速度=1000; 公共交通速度=2000; bool isTurnedUp=false; bool isTurnedDown=错误; bool

所以,我试图从头开始创造一场足球比赛。。。到目前为止,我所做的就是把球摆好。这就是我希望它的工作原理:当球员与球碰撞时,球向前跳一点。如果你开始跑动,球会被推得更远

现在,这里是我的球脚本(我使用标准FPS控制器作为角色):

使用UnityEngine;
使用系统集合;
公共类BallController:单行为{
私人刚体;
公共游戏对象角色;
公共浮动速度=1000;
公共交通速度=2000;
bool isTurnedUp=false;
bool isTurnedDown=错误;
bool done=false;
//用于初始化
无效开始(){
rb=GetComponent();
}
//每帧调用一次更新
无效固定更新(){
//Debug.Log(isTurnedUp+,“+isTurnedDown);
开关(character.GetComponent().m_IsWalking)
{
大小写正确:
如果(isTurnedUp==false)
{
移动速度=移动速度/1.4f;
isTurnedUp=true;
isTurnedDown=false;
}
打破
案例错误:
如果(isTurnedDown==false)
{
移动速度=移动速度*1.4f;
isTurnedDown=true;
isTurnedUp=假;
}
打破
}
}
无效更新()
{
if(Input.GetMouseButtonDown(0))
{     

if(矢量3.距离(gameObject.transform.position,character.transform.position)在
OnCollisionCenter的内部
您需要确保球只能由玩家踢。您可以通过检查碰撞的名称或标记来检查玩家是否与球发生碰撞。以下示例使用该名称,并假设您的玩家游戏对象名为“玩家”

删除
done
标志,因为这只允许球员每隔一次碰撞时踢一次球,并删除
FixedUpdate()
调用,因为
FixedUpdate()
已在每次物理计算中自动调用

最后,如果要将球踢离球员,则需要计算远离碰撞点的方向,而不是使用
Vector3.forward
,如下所示

void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.name == "Player")
    {
        Vector3 direction = (collision.transform.position - transform.position).normalized;
        rb.AddForce(-direction * moveSpeed, ForceMode.Impulse);
    }
}

为什么要调用FixedUpdate?从
OnCollisionCenter
中删除
FixedUpdate
调用
FixedUpdate
会在每次物理计算中自动调用。此外,您是否希望球始终沿世界轴向前移动,还是基于与球碰撞的位置向前移动?
rb.AddForce(Vector3.forward*moveSpeed,ForceMode.pulse)
始终是世界前进的。好的,我删除了“完成”。添加一个
Debug.Log(“测试”)
OnCollisionCenter中的消息
。它是否每次成功踢球时都会打印?即使没有踢球也会打印?我在这方面没有太多经验,但我相信你不需要编写任何代码来让球从其他刚体上弹开。物理应该解决这个问题。这应该弄清楚。
Vector3.forward
是由(0,0,1)定义的向量。当你的球员触球时,无论角度如何,你的球是否总是沿着同一方向移动?尝试用以下两行替换if语句中当前的内容:
Vector3 direction=(collision.transform.position-transform.position).normalized;
rb.AddForce(-direction*moveSpeed,ForceMode.pulse);
Replace
rb.AddForce(Vector3.forward*moveSpeed,ForceMode.pulse)
来自我的答案,其中包含我之前评论中的两行代码。它未经测试。如果它不起作用,我可以稍后在我的电脑上玩它。很高兴听到它!我将使用之前评论中的代码更新答案。
void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.name == "Player")
    {
        Vector3 direction = (collision.transform.position - transform.position).normalized;
        rb.AddForce(-direction * moveSpeed, ForceMode.Impulse);
    }
}