public void DoUpdate(float deltaTime) { timer += deltaTime; if (timer < updateInterval) { return; } if (owner == null) { return; } timer = 0; Vector2Int dir = Vector2Int.zero; var isReachTheEnd = CollisionHelper.HasColliderWithBorder(owner.dir, owner.GetHeadPos()); if (isReachTheEnd) { List <int> allWalkableDir = new List <int>(); for (int i = 0; i < (int)(EDir.EnumCount); i++) { var vec = (Vector2)CollisionHelper.GetDirVec((EDir)i) * Walker.TANK_HALF_LEN; var pos = owner.pos + vec; if (!CollisionHelper.HasCollider(pos)) { allWalkableDir.Add(i); } } var count = allWalkableDir.Count; if (count > 0) { owner.dir = (EDir)(allWalkableDir[Random.Range(0, count)]); } return; } var iPos = owner.pos.Floor(); if ((owner.pos - (iPos + Global.UnitSizeVec)).sqrMagnitude < sqrtTargetDist) { if (Random.value > turnRate) { return; } //random change dir if it can var borderDir = CollisionHelper.GetDirVec((EDir)((int)(owner.dir + 1) % (int)EDir.EnumCount)); var iBorder1 = iPos + borderDir; var iBorder2 = iPos - borderDir; if (!CollisionHelper.HasCollider(iBorder1)) { owner.dir = CollisionHelper.GetEDirFromVec(borderDir); } else if (!CollisionHelper.HasCollider(iBorder2)) { owner.dir = CollisionHelper.GetEDirFromVec(Vector2Int.zero - borderDir); } } }