Làm thế nào để đẩy và xếp mục tiêu chính xác theo máy va chạm và tọa độ của nó?


7

Tôi đang thực hiện một trò chơi đơn giản khác, một trò chơi bắt, trong đó một đối tượng trò chơi sinh sản phải được bắt bằng cách sử dụng một cái xiên để xiên nó. Đây như thế nào:

  1. Khi bắt đầu, vật rơi ( màu đỏ ) sẽ rơi theo hướng thẳng đứng ( màu xanh lam ) nhập mô tả hình ảnh ở đây

  2. Khi nhắm đúng mục tiêu, mục tiêu sẽ rơi xuống dọc theo đường xiên. ( màu xanh lam ) Sau đó, một mục tiêu khác được sinh ra và sẽ rơi thẳng đứng. ( màu đỏ ) nhập mô tả hình ảnh ở đây

  3. Khi nhắm thành công một lần nữa trong một vệt, mục tiêu thứ hai sẽ rơi dọc theo xiên và xếp chồng lên nhau. Quá trình tương tự lặp đi lặp lại khi một mục tiêu khác được sinh ra. nhập mô tả hình ảnh ở đây

Tuy nhiên, khi tôi thử chạy nó trên tab cảnh trong Unity, khi đưa ra một vài mục tiêu, thay vì dòng chảy trơn tru và xếp chồng lên nhau, cuối cùng lại phủ lên nó thay vì xếp nó lên như một chiếc bánh kếp. Đây là những gì nó trông giống như: nhập mô tả hình ảnh ở đây

Như tôi nhận thấy khi đạt được một nửa tiến trình của mình, tôi đã cố gắng tìm ra cách đối phó với các vật thể va chạm mà không dính vào nhau để nó thực sự xếp chồng lên nhau như trong ví dụ của hình ảnh. 3. Đây là mã script tôi đã thêm vào đối tượng trò chơi đích:

using UnityEngine;
using System.Collections;

public class ImpaleStateTest : MonoBehaviour {

    public GameObject target;
    public GameObject skewer;

    public bool drag = false;

    private float stack;
    private float impaleCount;

    void Start () {
        stack = 0;
        impaleCount = 0;
    }

    void Update () {
        if(drag) {
            target.transform.position = new Vector3 (DragTest.dir.transform.position.x, DragTest.dir.transform.position.y - 0.35f, 0);
            target.transform.rotation = DragTest.degrees;
            target.rigidbody2D.fixedAngle = true;
            target.rigidbody2D.isKinematic = true;
            target.rigidbody2D.gravityScale = 0;

            if(Input.GetMouseButton(0)) {
                Debug.Log ("Skewer: " + DragTest.dir.transform.position.x);
                Debug.Log ("Target: " + target.transform.position.x);
            }
        }
    }

    void OnTriggerEnter2D(Collider2D collider) {
        impaleCount++;
        Debug.Log ("Impaled " + impaleCount + " time(s)!");
        drag = true;
        audio.Play ();
    }

}

Ngoài ra, tôi không chắc liệu nó có đúng không, nhưng cách duy nhất để dán các mục tiêu bị nghiêng trong khi kéo xiên sang trái hoặc phải là chỉ lấy tọa độ X từ xiên. Có điều gì khác để giới thiệu nó để cải thiện hành vi này thực tế nhất có thể? Xin vui lòng giúp đỡ.

Câu trả lời:


1

Bạn đang sử dụng OnTriggerEnter2D, vì vậy tôi đoán bạn đang sử dụng kích hoạt intead của máy va chạm. Kích hoạt không bị ảnh hưởng từ các vụ va chạm trái ngược với máy va chạm, thay vào đó, họ gửi tin nhắn đến các kịch bản trên đó và va chạm vào trò chơi.

Vì vậy, nếu bạn muốn "vòng tròn" của mình va chạm, bạn nên làm cho chúng không kích hoạt.


0

Vấn đề xếp chồng

Về vấn đề xếp chồng, tôi không chắc lớp của bạn được thiết lập như thế nào, nhưng tôi sẽ xem xét xử lý vị trí của các phần tử xếp chồng dựa trên cách tiếp cận được lập chỉ mục.

Đối với trường hợp (mã giả):

class Skewer : MonoBehaviour
{
   public List<SkewerElements> skewerElements = new List<SkewerElements>();
   public float skewerElementHeight = 1; // 

   public void UpdateSkewerPositions()
   {
       int count = skewerElements.Count; 
       float yOffset = count * skewerElementHeight; // use an offset to start

       for(int i = 0; i < count; i++)
       {
           // Basically by manipulating the yOffset you can "stack" elements based on the count of elements.
           skewerElements[i].transform.position = new Vector3(transform.position.x, transform.position.y + (-yOffset + (skewerElementHeight * i)), 0);
       }
   }
}

Tôi đã sử dụng một yPackset âm bởi vì nếu xiên y bằng 0. Sau đó, chúng ta di chuyển xuống phần tử đầu tiên bằng số đếm của các xiên. Sau đó, chúng tôi tăng y theo chỉ số của phần tử theo chiều cao của nó.


0

Động cơ sang một bên, xung đột vòng tròn là cực kỳ dễ dàng để lập trình - bạn có thể làm điều đó từ đầu. Mỗi đối tượng hình tròn phải có giá trị vị trí Vec2d và bán kính.

Trong vòng lặp cập nhật của bạn, lặp qua danh sách tất cả các vòng tròn của bạn và sau đó kiểm tra xem liệu có giá trị pos nào của một không,> = vị trí của bất kỳ vòng tròn nào khác, + cả hai radiai.

Nếu điều này là đúng, hãy ngăn chặn lực hấp dẫn tác động lên các vòng tròn đang chạm vào. Hoặc, bạn có thể thực hiện một lực đẩy cho đối tượng di chuyển. Hãy nhớ rằng, nếu hai lực (trọng lực và lực đẩy) có chênh lệch nhỏ hơn 1, bạn phải đặt cả hai về 0, nếu không chúng sẽ rung.

Bạn sẽ muốn có một thư viện Vec2d cho việc này, trừ khi bạn muốn tự mình chạy toán học vectơ (nó không khó lắm).

Đối với xiên: vì các lực duy nhất bạn đang đối phó là trọng lực và va chạm, bạn không phải lo lắng về bất kỳ vật lý phức tạp nào. Xiên là một đường, vì vậy bạn có thể kiểm tra sự va chạm của nó bằng cách xác định xem có bất kỳ đường tròn x hoặc y nào> = vị trí xiên không.

Tất cả điều này nên được khá thẳng về phía trước, bình luận nếu bạn cần chi tiết.

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.