我有一个游戏,里面有效地包含了两个球拍,我已经设置好让玩家或AI可以控制任一球拍。然而,我正在尝试弄清楚如何让我的AI能够平滑地追赶并接住球,而不是简单地通过基本的“球的方向”=AI移动的相反方向来强行实现。
为此,我正在尝试编写一些代码,让AI能够预测球在其场地内或即将进入其场地时会落在哪里。但进展得并不顺利。这是我想实现的效果的示意图:
所以,我一直在研究Unity3D,并想出了这个方案:
Vector3 BallMinder = BallPosition.gameObject.rigidbody.velocity;float BallX = BallMinder.x;float BallY = BallMinder.y * Time.deltaTime;float GroundHitPointX = (BallY + BallX);Vector3 BallImpactPoint = new Vector3 (GroundHitPointX, 0, 0);Debug.Log (BallImpactPoint);Debug.DrawRay (BallImpactPoint, Vector3.up, Color.green);
然而,我觉得我可能过度简化了或者遗漏了某些东西。我的计算结果偏差很大,而且射线并没有出现在它应该出现的地方,如果它确实出现了的话。我哪里做错了?
回答:
基本上,你需要在每一步对球施加重力,使其看起来自然,类似这样:
球在你的位置准备被抛出
ball.x = 20;ball.y = 10;xVelocity = 0; yVelocity = 0;gravity = 0.1;
你抛出球
当你抛出球时,你将xVelocity设置为一个常数,比如1,将yVelocity设置为5。所以:
xVelocity = 1;yVelocity = 5;ball.x+=xVelocity;ball.y+=yVelocity; //开始球的移动
现在在游戏循环中,你这样计算球的位置:
tick{ if(ball.y > 10) //如果球在地面上方(假设10是地面) { ball.x+=xVelocity; ball.y+=yVelocity; yVelocity-=gravity; }}
这样,球应该会沿着完美的弧线飞行。现在,要计算着陆区,你可以用虚拟数字再次做同样的事情
while(dummyBall.y > 10){ dummyBall.x+=xVelocity; dummyBall.y+=yVelocity; yVelocity-=gravity;}landingPosX = dummyBall.x;
你可能需要调整这些数字,但如果我记得没错的话,应该会像这样工作。希望这有意义