我正在制作一个非随机生成的亚军游戏,我正在尝试编写老板进入和战斗的代码。因此,游戏由一个一直在屏幕上的宇航员(玩家)组成(因此,他,背景和相机永远都不会移动,玩家可以移动但受到限制)。
所有危险都移到玩家身上,他必须避免或击败它们,直到最后一个危险是上司。老板在这条线的尽头,沿着z轴也朝玩家方向移动,我希望它在与Quad碰撞时停止,因此老板是静态的,他们可以战斗。
之后,我希望老板上下移动并使用Lerp功能射击玩家。
代码如下:
public class BossController : MonoBehaviour {
public float speed;
public float health;
public Animator anim;
public Transform startMarker;
public Transform endMarker;
private Rigidbody rb;
private HUDController hud;
private bool startIntro = false;
private float startTime;
private float journeyLength;
void Start () {
startTime = Time.time;
journeyLength = Vector3.Distance (startMarker.position, endMarker.position);
anim = GetComponent<Animator> ();
rb = GetComponent<Rigidbody> ();
rb.velocity = transform.forward * -speed;
}
void Update(){
//transform.position += transform.forward * -speed * Time.deltaTime;
if (startIntro) {
rb.velocity = new Vector3(0,0,0);
Fight ();
}
}
void Fight(){
float distCovered = (Time.time - startTime) * speed;
float fracJourney = distCovered / journeyLength;
while(true)
{
transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);
}
}
void OnTriggerEnter(Collider other){
if (other.gameObject.CompareTag ("bossEntry")) {
startIntro = true;
//anim.SetTrigger ("quad");
}
}
}
我首先尝试使用刚体,当刚体碰撞时,刚体的速度为0,并且只要注释了Fight()方法,就可以正常工作。那也许是因为lerp函数吗?
当老板击中对撞机时,它没有被注释,一切都冻结了,我不能再使用Unity了,我必须重新启动程序。
请帮助!
编辑:我删除了while(true)循环,现在当boss与quad碰撞而不是紧绷时,boss掉落了。凸台位于空对象下方,起始标记和结束标记也位于空对象下方。每个组件都附加到空对象(父对象)上。
答案 0 :(得分:0)
尝试并跟踪(打印)您的验证字的值。 我猜你这里的除数为0- float fracJourney = distCovered / flyingLength;
如果不是,则很可能是无休止的循环或至关重要的空指针。
答案 1 :(得分:0)
对不起,我现在才注意到这一点。
transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);
第二个Lerp立即覆盖第一个的值。如果您想要类似乒乓球的效果,请标记以确定所需的当前状态。
bool toEndMarker = true;
void Fight() {
//Some code here
if(toEndMarker)
{
transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
if(//DETERMINE if transform.position is already at end marker)
{
toEndMarker = false;
}
}
else
{
transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);
if(//DETERMINE if transform.position is already at start marker)
{
toEndMarker = true;
}
}
}