所以,我正在尝试从头开始制作足球比赛……到目前为止,我所做的只是设置球。这就是我要的工作方式:当玩家与球碰撞时,球会向前跳一点。如果您开始跑步,则球将被推得更远。
现在,这是我的控球脚本(我使用标准的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);
}
}
我的问题是,球不符合我的期望……如果碰到它时球会向前跳,那感觉就像是运气。有人可以告诉我我做错了什么吗?
答案 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);
}
}