>

인터넷에서 궁수 자리라는 게임을 찾았습니다. 이 게임은 매우 재미 있고 질문이 있습니다.이 게임 에서처럼 화살표를 어떻게 움직일 수 있습니까? 각 구마다 다른 중력이 있다는 것을 알고 있지만이 수식을 사용하려고하면 예상대로 작동하지 않습니다. 이 문제를 해결하는 데 도움이 될 수 있습니까? 감사합니다.

 public List<PlanetABC> p = new List<PlanetABC>() { 
    new PlanetABC(){
        x = 0.91f,
        y = -1.28f,
        gravity = 5,
        r = 5
    },
    new PlanetABC(){
        x = 8.12f,
        y = -1.3f,
        gravity = 3,
        r = 10
    }
};
void Start () {
}
void Update () {
    float gravityOnX = 0;
    float gravityOnY = 0;
    foreach (var planet in p)
    {
        if (Vector2.Distance(g.transform.position, new Vector2(planet.x, planet.y)) > planet.r)
            continue;
        if (planet.x > g.transform.position.x)
            gravityOnX += planet.gravity;
        else gravityOnX -= planet.gravity;
        if (planet.y > g.transform.position.y)
            gravityOnY += planet.gravity;
        else gravityOnY -= planet.gravity;
    }
    if (currentGravityX > gravityOnX)
        currentGravityX -= Time.deltaTime;
    else currentGravityX += Time.deltaTime;
    if (currentGravityY > gravityOnY)
        currentGravityY -= Time.deltaTime;
    else currentGravityY += Time.deltaTime;
    Debug.Log(currentGravityX + "/" + currentGravityY);
    var DEG2RAD = Mathf.PI/180;
    float vx1 = Mathf.Cos(angle * DEG2RAD) * power ;
    float vy1 = Mathf.Sin(angle * DEG2RAD) * power;
    float y = (0.5f * currentGravityY * time + vy1) * time;
    float x = (0.5f * currentGravityX * time + vx1) * time;
    Vector3 pos = g.transform.position;
    pos.x = x;
    pos.y = y;
    g.transform.position = Vector3.Lerp(g.transform.position, pos, Time.deltaTime);
    time += Time.deltaTime;
}

게임은 다음과 같습니다 : https://gprosser.itch.io/sagittarius


  • 답변 # 1

    중력을 계산하는 방법은 드문 경우입니다. 이런 식으로 구성한 특별한 이유가 있습니까?

    역 제곱 감소를 가진 기존의 중력은 다음과 같습니다 ...

    // We're applying physics forces, 
    // so for consistency we should do this at a fixed timestep:
    void FixedUpdate() 
    {
        // Initialize our acceleration to a zero vector:
        Vector2 totalAcceleration = Vector2.zero;
        foreach (var planet in p)
        {
            // Construct an arrow from the projectile to the planet center.
            Vector2 offset = planet.position - this.transform.position;
            Vector2 direction = offset.normalized;
            // Get the distance between the projectile and the planet.
            float distance = Vector2.dot(direction, offset);
            // Accumulate acceleration in the direction toward the planet,
            // with strength proportionate to the inverse square of the distance.
            totalAcceleration += direction * planet.gravity / (distance * distance);
        }
        // Apply the acceleration.
        // (f = ma, so we multiply by mass to convert to a force)
        rigidbody2D.AddForce(totalAcceleration * rigidbody2D.mass, ForceMode.Force);
    }
    
    

    원하거나 코스에 따라 이러한 힘을 직접 통합 할 수 있습니다. 그러나 내장 물리 시스템은 이미 이런 종류의 작업을 효율적이고 안정적으로 수행하기 위해 만들어 졌으므로 기존 기술을 활용하는 것은 나쁜 생각이 아닙니다.

    버전과의 주요 차이점은 다음과 같습니다.

    실제 물리학에서와 같이 역 제곱 법을 사용하여 중력이 떨어짐

    행성에는 바깥 쪽 반지름이 없습니다 (원하는 경우 하나를 강제 할 수는 있지만, 발사체가 한 정권에서 다른 정권으로 갑자기 이동함에 따라 힘 필드에 불연속적인 변화가 발생하는 것을 조심하십시오)

    가속도는 두 성분을 개별적으로 다루지 않고 x와 y 성분을 모두 고려한 벡터로 계산됩니다

    통합 및 프레임 속도 독립은 물리 시스템에 위임됩니다

  • 이전 java - libgdx ashley에서 ECS 구성 요소를 OOP로 래핑하는 방법은 무엇입니까?
  • 다음 javascript - 모서리가 제곱이 아닌 타일로 HTML5 캔버스 타일 맵을 만들려면 어떻게해야합니까?