C++ 物理挙動もどき①
こんばんは。ネノワヲンです。
やったこと
今日は、プレイヤーの落下やめり込み防止などをしました。物理挙動もどき pic.twitter.com/HhpagmPkTZ
— ネノワヲン@ネノぶろ! (@nenowawon) 2018年11月17日
中身
void Player::LateUpdate(float deltaTime) { float fallSpeed = 0.01f; // 落下させる MoveY(-fallSpeed); // コライダーのリストを取得 for (auto collider : DirectXRenderer::instance->m_ColliderList) { //テスト用オブジェクトにぶつかった場合 if (collider->m_pGameObject->m_tag != Tag::TEST) { continue; } // 衝突判定をする if (!m_pCollider->CheckCollider(collider)) { continue; } // 衝突物の座標 XMFLOAT3 checkColliderPos = collider->m_pGameObject->m_transform->m_pos; RectangleVertex myRect = m_pCollider->GetRect(); RectangleVertex collisionRect = collider->GetRect(); const float beforeMagine = 0.001f; XMFLOAT3 movePos = XMFLOAT3(0.0f, 0.0f, 0.0f); // 自分が上側の場合かつ自分が下側に移動した場合 if (m_transform->m_pos.y > checkColliderPos.y && m_CurrentMoveTemp.y < 0.0f) { float moveYTemp = abs(collisionRect.top - myRect.bottom) + beforeMagine; if (moveYTemp > movePos.y) { // 上に移動する movePos.y = moveYTemp; } } // 自分が下側の場合かつ自分が上側に移動した場合 else if (m_transform->m_pos.y < checkColliderPos.y && m_CurrentMoveTemp.y > 0.0f) { float moveYTemp = -abs(collisionRect.bottom - myRect.top) - beforeMagine; if (moveYTemp < movePos.y) { // 下に移動する movePos.y = moveYTemp; } } // 自分が右側の場合かつ自分が左側に移動した場合 if (m_transform->m_pos.x > checkColliderPos.x && m_CurrentMoveTemp.x < 0.0f) { float moveXTemp = abs(collisionRect.right - myRect.left) + beforeMagine; if (moveXTemp > movePos.x) { // 移動量を更新する movePos.x = moveXTemp; } } // 自分が左側の場合かつ自分が右側に移動した場合 else if (m_transform->m_pos.x < checkColliderPos.x && m_CurrentMoveTemp.x > 0.0f) { float moveXTemp = -abs(collisionRect.left - myRect.right) - beforeMagine; if (moveXTemp < movePos.x) { // 移動量を更新する movePos.x = moveXTemp; } } // 移動する Move(movePos); } }
概要
課題
今回の実装の問題点は、X軸とY軸を同時に動かすとバグるところですね。。。 原因は分かったのですが、どうやって直そうか悩んでいます。。。
あとがき
ユニティちゃんはかわいい。