我正在尝试使用Unity制作FPS足球游戏,但是我的脚本无法正常工作

时间:2018-10-03 18:30:26

标签: c# unity3d

所以,我正在尝试从头开始制作足球比赛……到目前为止,我所做的只是设置球。这就是我要的工作方式:当玩家与球碰撞时,球会向前跳一点。如果您开始跑步,则球将被推得更远。

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

 using UnityEngine;
 using System.Collections;

 public class BallController : MonoBehaviour {

     private Rigidbody rb;

     public GameObject character;
     public float moveSpeed = 1000;
     public float shootSpeed = 2000;

     bool isTurnedUp = false;
     bool isTurnedDown = false;
     bool done = false;

     // Use this for initialization
     void Start () {
         rb = GetComponent<Rigidbody>();

     }

     // Update is called once per frame
     void FixedUpdate () {

         //Debug.Log(isTurnedUp + ", " + isTurnedDown);

         switch (character.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().m_IsWalking)
         {
             case true:
                 if (isTurnedUp == false)
                 {
                     moveSpeed = moveSpeed / 1.4f;
                     isTurnedUp = true;
                     isTurnedDown = false;
                 }
                 break;

             case false:
                 if (isTurnedDown == false)
                 {
                     moveSpeed = moveSpeed * 1.4f;
                     isTurnedDown = true;
                     isTurnedUp = false;
                 }
                 break;
         }
     }

     void Update()
     {

         if (Input.GetMouseButtonDown(0))
         {     
             if (Vector3.Distance(gameObject.transform.position, character.transform.position) <= 5)
             {
                 float distance = Vector3.Distance(gameObject.transform.position, character.transform.position);
             }
         }

     }


     void OnCollisionEnter(Collision collision) {

         FixedUpdate();
         if (done == false) {
             rb.AddForce(Vector3.forward * moveSpeed, ForceMode.Impulse);
             done = true;
         }
         else {

             done = false;

         }      
     }     

     //other
     void OnDrawGizmosSelected()
     {
         Gizmos.color = Color.yellow;
         Gizmos.DrawWireSphere(transform.position, 2);
     }
 }

我的问题是,球不符合我的期望……如果碰到它时球会向前跳,那感觉就像是运气。有人可以告诉我我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

OnCollisionEnter内,您需要确保球员只能踢球。您可以通过检查碰撞的名称或标记来检查球员是否与球相撞。下面的示例使用该名称,并假设您的玩家GameObject名为“玩家”。

删除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);
    }
}