Làm thế nào để tôi tạo ra một vật thể có thể kéo được để cản trở chướng ngại vật?


8

Tôi đưa ra một câu hỏi khác về kéo chuột (tôi đang sử dụng Unity với C #), nhưng với một chi tiết cụ thể ít phổ biến hơn: sự tồn tại của các chướng ngại vật ở giữa máng kéo xảy ra (không gian 3D, không phải 2D) .

Hãy để tôi giải thích. Giả sử tôi có một mặt phẳng mà tôi muốn kéo một khối gọi là "obj". Điều đó thật dễ dàng. Đây là cách thực hiện đơn giản của tôi cho điều đó:

void Update () {
  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  RaycastHit hit;
  if(Physics.Raycast(ray, out hit, 1000000))
  obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z);
}

Nó hoạt động. Tuy nhiên, giả sử rằng tôi cũng có một vài hình khối khác trên máy bay, đó là những chướng ngại vật. Rõ ràng, khi người chơi di chuyển "obj" trên máy bay, chuyển động như vậy sẽ bị chặn bởi các chướng ngại vật. Và sau đó, trong khi va chạm với các chướng ngại vật, "obj" chỉ nên di chuyển bắn tỉa sang hai bên của chướng ngại vật đó. Nếu chuột được di chuyển và "obj" dừng va chạm với chướng ngại vật, chuyển động kiểu kéo tự do lại tiếp tục.

đối tượng bị kéo về phía chướng ngại vật và dừng lại ở rìa của nó, sau đó tiếp tục lại khi lực cản vượt qua chướng ngại vật

Để làm cho thử thách khó hơn, tôi đang cố gắng hết sức để đạt được điều đó mà không cần sử dụng các thành phần RigidBody tại các chướng ngại vật (đối tượng bị kéo có thể có nó). Bất kỳ ý tưởng về cách hiệu quả nhất để đạt được điều đó là gì? Cảm ơn nhiều!

EDIT: Các nhà bình luận đã chú ý rằng tôi nên đề cập rằng các đối tượng được phép xoay khi chụp.

EDIT 2: Xem xét độ khó của công thức ban đầu, tôi đã thay đổi câu hỏi cho phép sử dụng các thành phần Rigidbody tại các đối tượng được kéo. Giải pháp không thể sử dụng các thành phần Rigidbody tại các chướng ngại vật.


Bạn đang di chuyển hình dạng lồi tùy ý - chúng luôn luôn bốn phía? Họ luôn luôn là 2D?
Steven

Tôi có thể biết lý do tại sao bạn sẽ không sử dụng Rigidbody không? Chúng là cách dễ nhất để làm những gì bạn muốn mà không phải thực hiện lại mã đã có sẵn trong Unity.
EvilTak

@EvilTak Tôi thích học cách đối phó với hình học liên quan đến nhiệm vụ và vì lý do hiệu suất, tôi không thích sử dụng Rigidbody trừ khi điều đó thực sự không thể tránh khỏi. Trong trường hợp đặc biệt này, tôi sẽ có nhiều hàng ngàn đối tượng hành xử như những trở ngại
mand

Btw, cảm ơn @Anko (hoặc bất cứ ai đã làm nó) đã bao gồm hình ảnh hoạt hình đó để minh họa vấn đề! Tôi vẫn đang nghĩ cách tốt nhất để làm như vậy.
MA

1
@Steven và EvilTak: đối tượng có thể được phép xoay, các chướng ngại vật không nên. Các cách thông thường để phát hiện va chạm dường như là không đủ: đối tượng chính tiếp tục vào bên trong các đối tượng.
mand

Câu trả lời:


2

Thật khó để phát hiện va chạm mà không có bất kỳ sự cứng nhắc nào liên quan, nhưng vì bạn đang sử dụng các hình khối nên bạn có thể sử dụng Bound.Intersects . Mỗi bản cập nhật, kiểm tra xem giới hạn của đối tượng được kéo có giao nhau với giới hạn của bất kỳ chướng ngại vật nào không. Nếu vậy, bạn có thể thử điều này:

  1. Vô hiệu hóa Trình kết xuất lưới cho đối tượng được kéo để ẩn nó (nhưng tiếp tục kéo nó).
  2. Thả một đối tượng giữ chỗ có thể nhìn thấy, giống hệt với đối tượng được kéo ở vị trí cuối cùng trước khi giao cắt giới hạn (bây giờ có vẻ như đối tượng đã dừng, nhưng thực sự bạn vẫn đang kéo bản gốc).
  3. Mỗi bản cập nhật, kiểm tra xem liệu giới hạn của đối tượng bạn vẫn đang kéo có giao nhau với giới hạn của chướng ngại vật hay không.
  4. Khi giới hạn của đối tượng được kéo không còn giao nhau với chướng ngại vật, hãy xóa / hủy kích hoạt đối tượng giữ chỗ và bật lại Trình kết xuất lưới cho đối tượng được kéo để hiển thị lại.

Bạn không bao giờ ngừng kéo khối; Nó chỉ đơn giản xuất hiện cho người dùng rằng khối đã ngừng kéo trong khi nó sẽ giao nhau với một chướng ngại vật.


Dựa trên các nhận xét trước đó và về câu trả lời của bạn, tôi đã chỉnh sửa câu hỏi để dễ thực hiện hơn: bây giờ hãy nói rằng Rigidbody có thể được sử dụng cho đối tượng có thể kéo hoặc giữ chỗ của nó. Rigidbody chỉ không thể được sử dụng cho các chướng ngại vật.
MA

1

Không phải tự mình làm, đây là những gì tôi sẽ thử:

  1. Quyết định mức độ chướng ngại vật trên máy bay phải cao đến mức nào để chặn đối tượng bị kéo của bạn (trong đó "cao" có nghĩa là được loại bỏ dọc theo trục nào phù hợp. Tôi giả sử là hướng về phía máy ảnh).
  2. Mỗi bản cập nhật, lưu vị trí của hit raycast của bạn.
  3. Mỗi bản cập nhật, trước khi lưu vị trí của lần truy cập raycast hiện tại, hãy kiểm tra vị trí của lần truy cập raycast hiện tại so với vị trí của lần truy cập raycast trước đó.
  4. Nếu chênh lệch> = chiều cao chặn, hãy dừng đối tượng chuyển động của bạn tại vị trí phát tia trước đó.

Dường như với tôi rằng nếu bạn muốn đối tượng của mình kéo theo một mặt phẳng nghiêng của một chướng ngại vật, bạn chỉ cần chuyển đổi nó tiếp tục theo vị trí của tia ray mới nhất.


Cảm ơn câu trả lời của bạn, @Evan. Tuy nhiên, giải pháp đó sẽ không chính xác. Giả sử RayCast sẽ được bắn từ trung tâm của khung giới hạn của vật thể có thể kéo được. Điều gì xảy ra nếu chướng ngại vật cản đường chỉ là một phần của vật thể có thể kéo được ở bên trái hoặc bên phải của vật đúc? Ngay cả khi chúng ta tăng số lượng tia phát ra (những gì có thể tăng theo cấp số nhân nếu đối tượng có thể kéo có thể được kéo theo các hướng 360 độ trong các kích thước X, Z), tùy thuộc vào chướng ngại vật nhỏ so với vật thể có thể kéo được, nó vẫn có thể được ở giữa tia đúc - và do đó sẽ không được phát hiện
mand

Được rồi, tôi nghĩ tôi hiểu ý của bạn.
Evan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.