我正在制作一个非随机生成的跑步游戏,我正在尝试编写老板进入和战斗的代码。因此,游戏由始终留在屏幕上的宇航员(玩家)组成(因此他、背景和相机永远不会移动,玩家可以移动,但它被夹住了。
所有的危险都向玩家袭来,他必须避开它们或击败它们,直到最后一个危险,即老板。 Boss 位于线的末端,并沿着 z 轴朝向玩家,我希望它在与四边形碰撞时停止,因此 Boss 是静态的,他们可以战斗。
之后我想让boss上下移动并用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 函数?
如果没有评论,当 Boss 撞到碰撞器时,一切都会冻结,我不能再使用 Unity,我必须重新启动程序。
编辑:我删除了 while(true) 循环,现在 Boss 在与四边形碰撞时会直接掉下来,而不是 lerping。 Boss 位于空物体下方,开始和结束标记也位于空物体下方。每个组件都附加到空对象(父对象)。
尝试跟踪(打印)您的变量的值。 我猜你这里的除数是 0 - float fracJourney = distCovered /旅程长度;
如果没有,很可能你有一个无限循环,或者一个至关重要的空指针。
抱歉,我现在才注意到这一点。
transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney);
transform.position = Vector3.Lerp(endMarker.position, startMarker.position, fracJourney);
第二个 Lerp 立即覆盖第一个 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;
}
}
}