2014-11-11 2 views
1

필자는 효과적으로 두 개의 패들이있는 게임을 가지고 있으며 플레이어 나 AI가 패들 중 하나를 제어 할 수 있도록 작동하도록 설정했습니다. 그러나, 나는 AI가 실제로 "공의 방향"= 반대 방향 AI가 움직이는 단순한 짐승 대신에 공을 따라 부드럽게 달려서 잡는 방법을 알아 내려고 노력하고 있습니다.공을 잡으려고 AI를 가르치시겠습니까?

그렇게하기 위해 AI는 공이 법정에 있거나 앞으로 갈 예정인 시점을 AI가 예측할 수 있도록 몇 가지 코드를 작성하려고합니다. 그렇게 잘되지 않습니다. 이것은 내가 무엇을 달성하고자하는의도 : 그래서

Parabolic arc of ball and prediction points

, 내가 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); 

그러나, 나는 느낌 잊었거나. 내 계산 방법은 꺼져 있고 광선이 전혀 나타나지 않으면 그 광선이 나타나지 않습니다. 내가 뭘 잘못 먹었 니?

+0

매우 간단하게 처리 할 수 ​​있다고 생각합니다. 당신은 볼의 X 위치를 취하여 컴퓨터 패들을 최대 속도로 그 위치로 이동시킵니다. 솔루션을 위해 컴퓨터 padle은 볼이 아래로 떨어질 때까지 기다려야합니다 (당신이했던 것처럼) 드롭 다운 지점을 계산할 필요가 있습니다. 그러나 apperently 그것의 잘못된 계산 ㅎ :) – Vajura

+0

그것은 이전에했던 것이었고 결코 꽤 느껴진 인간 - 저는 AI가 적어도 다른 플레이어처럼 행동하고 공을 잡으려고하지 않고 공을 잡으려고하고 어쩌면 50 %를 얻으려고합니다. – Merlin

답변

0

essentialy 당신은이 같은 자연 뭔가 보일 수 있도록 모든 단계에서 볼에 중력을 적용

볼이 당신의 위치에 당신이 공을 생각하다

ball.x = 20; 
ball.y = 10; 
xVelocity = 0; 
yVelocity = 0; 
gravity = 0.1; 

를 슬로우되었을 할 준비를
때 xVelocity를 상수로 설정하면 xVelocity를 1로, yVelocity를 5로 설정할 수 있습니다. 따라서 :

xVelocity = 1; 
yVelocity = 5; 
ball.x+=xVelocity; 
ball.y+=yVelocity; //to start the ball moving 

이제 gamel에서 이와

tick 
{ 
    if(ball.y > 10) //if the ball is off the ground (i asume 10 is ground) 
    { 
     ball.x+=xVelocity; 
     ball.y+=yVelocity; 
     yVelocity-=gravity; 
    } 
} 

공은 당신이 더미 번호

while(dummyBall.y > 10) 
{ 
    dummyBall.x+=xVelocity; 
    dummyBall.y+=yVelocity; 
    yVelocity-=gravity; 
} 
landingPosX = dummyBall.x; 

다시 같은 일을 간단하게 할 수있는 착륙 지점을 계산하기 위해 현재 완벽한 아크 비행한다 :이 같은 볼의 위치를 ​​계산 OOP 아마도 숫자를 조정할 필요가있을 것입니다. 그러나 모든 것을 정확하게 기억한다면이 같은 것을 사용해야합니다. 그것이 의미가되기를 바란다.

+0

그래서 나는 가깝지만 시가가 없었다. 공은 이미 물리학과 중력으로 자신의 것으로 움직이지만, 착륙장 계산에 중력을 적용하는 방법을 알아 내려고했습니다. 나는 할 수있을 때 이것을 시도 할 것이다. – Merlin

+0

너무 많은 좋은 것들로 대답을 선택하는 것은 조금 어려웠습니다. 나는 반쯤에 있었고 나머지 부분을 고치는 데이 방법을 사용했다. 또는 적어도 그것의 일부. 승인 마크가 있어야합니다. – Merlin

1

이것은 중력이 아래이고 바닥이 Y=0이라고 가정하여 단순화 될 것이다. 그것은 임의의 floorline과 중력 방향에 대한 vector math를 사용하여 확장 될 수 있습니다. 그러나 위의 두 가지 가정을 사용하여 여러분의 목적에 맞게 잘되어야합니다. 또한이 설명에 대해 BallPositionTransform 개체라고 가정하고 있지만, 그렇지 않은 경우 수학은 같을 것입니다. 나는 또한 볼에 공기 마찰이 없다고 가정하고 있는데, 이것은 공을 조금 더 복잡하게 만들 것입니다.

본질적으로 볼이 땅에 떨어질 때까지의 시간을 계산 한 다음 그 시간에 볼의 X 위치를 추정해야합니다. v 현재 속도이다

가속 오브젝트의 모션을 지시 고전 수식 a 가속도이며 t은 경과 시간이고, d = vt + at^2/2이다. 영향의 시간을 알아 내기 위해 t을 풀면됩니다.볼이 d = BallPosition.position.y * -1, a = Physics.gravity.yv = BallPosition.rigidbody.velocity.y을 설정하는 당신이 원하는 것 땅에 떨어지기 때

d = vt + at^2/2 solve for t

알아낼합니다. 그러면 충격이 발생할 때까지의 시간 (초)이 표시됩니다.

중력은 완전히 아래쪽이라고 가정하고 다른 힘은 볼에 작용하지 않으므로 충돌 시간에 볼의 X 위치는 BallPosition.position.x + BallPosition.rigidbody.velocity.x * impactTime입니다. 이것은 컴퓨터 플레이어가 앞으로 나아갈 X 위치입니다.

... 공은 궤도의 위쪽 부분에 있거나 컴퓨터 플레이어에서 멀리 떨어지더라도 중력이 완전히 아래쪽에있을 때 작동해야합니다. 인간이 공을 치고 공의 새로운 궤도를 설정하기를 기다리는 동안 컴퓨터가해야 할 일을위한 전략을 생각해 내고 싶을 것입니다. 아마 컴퓨터가 인간 쪽을 향해 뛰는 것을 원하지 않기 때문입니다 그물. 선수가 공을 칠 수있는 방법에 따라, 공이 인간에게 닿은 후에 새로운 속도를 예측하고,이 데이터를이 공식에 공급할 수 있습니다.

1

방정식은 모두 Kinematics입니다.

enter image description here

이러한 방정식 완벽 모션 발사체를 설명한다. 따라서 볼을 사용하여 어디에서 볼 것인지, 어떤 구성 요소로 볼 것인지 예측할 수 있습니다.

다음은 이해를 돕기위한 그래프입니다.

enter image description here

+0

게임의 물리 엔진은 현실 세계만큼 강하지는 않을 가능성이 크며 사실 실제로 개체가 실제로 어디에서 끝날지 예측하는 데 적합하지 않을 수 있습니다. – Servy

+0

@Servy 나는 OP가 자신의 물리학을 다룰 것이라고 생각했다. 예를 들어, 볼에 포스를 더하고 가속을 스스로 조절하는 등. Unity3d가 내게주는 것이 아니라 내 물리학에 의존하는 경향이 있습니다. 그래픽 렌더링에만 사용합니다. 그러나 OP가 엔진의 물리학에 크게 의존하고 있다면 당신은 훌륭한 포인트를 만듭니다. – FunctionR

관련 문제