我正在移動一排盒子,想創造一個無限的效果。每個最后一個盒子都會在開頭與克隆塊交換其位置(見圖)。
出于除錯目的,我使用 boxcast 作為每個盒子的 raycast。它不會像方框那樣移動,但會像圖片中的第一行 (1.) 一樣保持不變。
boxcast 作業正常,直到我用克隆框更改第 5 個框的位置并停用克隆框。在交換位置后,我的第一個 boxcast 在 6-10 幀內沒有命中碰撞器,即使 box 5 transform.position 正好在 boxcast 位置上。
我曾嘗試在 Boxcasting 之前更新物理變換。嘗試了不同的光線投射(重疊框、光線、...)。
private void MoveRowOfBlocks(float m)
{
//debug variable set true when setting box position to clone position
bool exceed = false;
for (int i = 0; i < movingBlockRow.Length; i )
{
GameBlock go = movingBlockRow[i].GetComponent<GameBlock>();
// Block exceeds valid area -> Swap with clone block
while (movingDir == Vector2.right && go.transformPositionCache.x m > GameField.xFieldExtent_M - GameField.blockWidth / 2
|| movingDir == Vector2.left && go.transformPositionCache.x m < -GameField.xFieldExtent_M GameField.blockWidth / 2
|| movingDir == Vector2.up && go.transformPositionCache.y m > GameField.yFieldExtent_M - GameField.blockWidth / 2
|| movingDir == Vector2.down && go.transformPositionCache.y m < -GameField.yFieldExtent_M GameField.blockWidth / 2)
{
exceed = true;
go.transformPositionCache -= GameField.totalWidth * movingDir;
//go.transform.position = go.transformPositionCache (m * new Vector2(Mathf.Abs(movingDir.x), Mathf.Abs(movingDir.y)));
blockExceedCount = movingSign;
Debug.Log(go.name " Exceeds field. Position from beginning. " "New Position: " go.transformPositionCache
" movingDir: " movingDir " Frame: " debugFrameCount);
if (blockClone != null || clonedBlock != null)
{
blockClone.SetActive(false);
blockClone = null;
clonedBlock = null;
}
cachedExceededBlock = go;
debugCount ;
}
debugCount = 0;
go.transform.position = go.transformPositionCache (m * new Vector2(Mathf.Abs(movingDir.x),Mathf.Abs(movingDir.y)));
if (exceed) Debug.LogError(go.transform.position);
}
// Move Cloned Object
if (blockClone != null)
{
Vector2 dest = (Vector2)clonedBlock.transform.position (GameField.totalWidth * cloneMovingDir) * -1;
blockClone.transform.position = dest;
}
if (exceed)
{
Physics.SyncTransforms();
Debug.LogError(movingBlockRow[4].transform.position);
}
// Using Boxcasts foreach init box position for debugging
foreach (Vector3 v in gameField.gridPointsWorldPosition) // gridpointsworldposition is initial box position (1.)
{
RaycastHit2D rayHit = Physics2D.BoxCast(v, new Vector2(GameField.blockWidth/2, GameField.blockWidth/2), 0, Vector2.zero);
if (rayHit.collider == null)
{
Debug.LogError("NO BOX FOUND IN CELL " v " Box position: " movingBlockRow[4].GetComponent<BoxCollider2D>().transform.position
" Frame: " debugFrameCount); // Rayhit.collider is null even though box position = v
}
}
debugFrameCount ;
}
uj5u.com熱心網友回復:
(假裝這是評論)
如果您希望物件表現得好像它沒有剛體一樣,請將剛體設定為靜態。
uj5u.com熱心網友回復:
為每個盒子添加一個剛體解決了我的問題。
編輯:嗯,它只在我沒有像上面顯示的那樣進行 Boxcast 檢查時才有效。當我在下一幀呼叫的movingblocks方法之前將它放在Update中時它會起作用。
因此,通過使用剛體,它仍然不會擊中確切的幀,而是會擊中下一幀!所以我通過呼叫協程并等待一幀來解決我的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/475316.html
上一篇:靜態函式隨每個實體更新