Bộ điều khiển nhân vật 2D trong sự thống nhất (cố gắng lấy lại các nền tảng trường học cũ)


11

Ngày nay, tôi đang cố gắng tạo một bộ điều khiển nhân vật 2D với sự thống nhất (sử dụng phisics). Tôi còn khá mới với các động cơ vật lý và thực sự rất khó để có được sự kiểm soát mà tôi đang tìm kiếm. Tôi sẽ rất vui nếu có ai có thể đề xuất giải pháp cho một vấn đề tôi đang tìm kiếm:

Đây là FixedUpdate của tôi ngay bây giờ:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

Tôi đang cố gắng ở đây để di chuyển cơ thể cứng nhắc áp dụng trọng lực và lực tuyến tính cho trái và phải. Tôi đã thiết lập một vật liệu vật lý làm cho không bị nảy và ma sát 0 khi di chuyển và 1 ma sát khi đứng yên. Vấn đề chính là tôi có máy va chạm có độ dốc và vận tốc thay đổi từ đi lên (chậm hơn), xuống dốc (nhanh hơn) và đi trên máy va chạm thẳng (bình thường). Làm thế nào điều này có thể được sửa chữa? Như bạn thấy tôi đang áp dụng tất cả các vận tốc tương tự cho trục x.

Đối với người chơi, tôi đã thiết lập nó với một quả cầu ở vị trí chân là người cứng nhắc mà tôi đang áp dụng lực lượng.

Bất kỳ lời khuyên nào khác có thể làm cho cuộc sống của tôi dễ dàng hơn với điều này đều được hoan nghênh :).

PD Trong khi về nhà tôi nhận thấy tôi có thể giải quyết điều này bằng cách sử dụng một lực không đổi song song với bề mặt người chơi đang đi bộ, nhưng không biết liệu đó có phải là phương pháp tốt nhất không.


4
Các nền tảng trường học cũ đã sử dụng "vật lý hoạt hình" được điều chỉnh bằng tay cho cơ học nhảy và điều khiển tốc độ trực tiếp (tức là không có vật lý nào) cho chuyển động đi bộ. Nếu bạn có thể viết lại bộ điều khiển nhân vật, hãy làm như vậy, bởi vì sẽ rất khó để chọc và đưa một mô phỏng vật lý yếu đuối vào các chuyển động sắc nét mà các trò chơi học đường cũ có.
Patrick Hughes

Vấn đề của việc viết một tùy chỉnh là phát hiện va chạm bị mất. Và không dễ để xây dựng lại nó mà không sử dụng raycast (tùy thuộc vào môi trường, v.v ... nó có thể là một loạt chúng). Làm thế nào để bạn xử lý tình huống này?
Notbad

Bạn có thể có máy va chạm trên những thứ vẫn còn hoạt hình tùy chỉnh - khi bạn sử dụng hệ thống cứng nhắc động học. Tôi đảm bảo rằng trong hầu hết các tình huống bạn không thực sự muốn vật lý / lực lượng trong thế giới thực, v.v. cho loại ứng dụng này. Nếu bạn đang tìm kiếm một góc độ kỹ thuật hơn, có lẽ hãy nghiên cứu Human IK
Runonthespot

1
Def mương vật lý trong tình huống này.
Ray_Garner

Câu trả lời:


7

Nếu bạn đang tìm cách bắt chước các nền tảng trường học cũ, bước một là bỏ hoàn toàn vật lý. Cuối cùng, bạn sẽ chiến đấu với hệ thống vật lý để có được chuyển động phi thực tế của một nền tảng trường học cũ. Có một cái nhìn về sự thay thế nhân vật này hoàn toàn bỏ qua vật lý để có được một ý tưởng tốt về một cách để thực hiện nó.


3

Có lẽ bạn sẽ hạnh phúc hơn khi đi với những gì mheona khuyên dùng. Nhưng nếu bạn sẽ sử dụng vật lý của Unity, thì có lẽ bạn muốn sử dụng ForceMode.VelocityChange.

Thí dụ:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

Bạn cũng nên áp dụng lực hấp dẫn toàn cầu trong cài đặt Vật lý của dự án và đối với các đối tượng bạn muốn giảm nhanh hơn, hãy thêm thành phần Lực lượng không đổi .

ForceMode.Impulselà tương tự nhưng bị ảnh hưởng bởi khối lượng cứng nhắc. Làm cho nó khó khăn hơn để điều chỉnh.


2

Ngay cả khi bạn không thích thành phần Bộ điều khiển nhân vật tích hợp (như tôi làm), hãy xem mã ví dụ của Unity cho Hướng dẫn trò chơi 2D .

Mã thực hiện một trò chơi 2D hoàn chỉnh với các nền tảng di chuyển, kẻ thù và các hộp bị va chạm, sử dụng Bộ điều khiển nhân vật.

Nhưng nếu bạn thậm chí không muốn xem, tôi khuyên bạn nên giảm thiểu việc sử dụng vật lý và cố gắng sao chép hành vi của nó bằng mã của riêng bạn. Tùy thuộc vào loại trò chơi 2D mà bạn đang lên kế hoạch, nó có thể hoạt động khá tốt. Chẳng hạn, thay vì dùng lực để Rigidbody.velocitydi chuyển nhân vật của bạn, bạn có thể gây rối trực tiếp Transform.Translate(), điều này di chuyển đối tượng Transform.positiondựa trên trục của nó. Bạn có thể xác định forwardbackliên quan đến chính đối tượng hoặc có thể là nền tảng hoặc sàn nhà Transform.up, vì vậy bạn sẽ biết nếu đó là một đoạn đường nối và loại biết góc của nó.

Ngoài ra, nếu bạn tạo một số loại điều khiển tốc độ atributte (ví dụ: phím được nhấn trong bao lâu), bạn có thể áp dụng nó cùng với hướng của mình trong khi dịch để ngăn nhân vật của bạn đi một cái gì đó quá nghiêng mà không có tốc độ, giống như họ đã làm trên Sonic the Hedgeoose cho Genesis / Mega Drive.

Nếu bạn chọn tiếp tục sử dụng vật lý, tôi hoàn toàn không thể giúp bạn vì tôi không giỏi lắm, nhưng hãy lưu ý rằng đó là một hành vi bình thường để đi lên 'dốc' chậm hơn vì cơ thể cần nhiều lực hơn để theo kịp , giống như đời thực.


Điều đầu tiên tôi đọc khi tôi đoàn kết là hướng dẫn đó. Vấn đề là cảm giác điều khiển khá tệ. Đây là lý do tại sao tôi muốn tìm giải pháp của riêng tôi. Mặt khác, khi bạn bắt đầu sử dụng Transform.Translate (), việc tạo dốc và những thứ khác không phải là điều dễ dàng. Bạn phải chiếu tia nhiều lần (2 hoặc 3 cho sàn, nhiều hơn cho hướng bạn đang di chuyển tùy thuộc vào kích thước anh hùng). Đối với thiết bị di động, raycast không tốt và ít hơn nếu bạn thực hiện 5..n mỗi lần lặp phát hiện va chạm. Có lẽ tôi có thể sai, nhưng tôi không nghĩ vậy.
Notbad

1

Những gì bạn muốn nó được xây dựng trong Bộ điều khiển nhân vật . Bằng cách đặt thuộc step offsettính trên thành phần này, bạn có thể khiến người chơi di chuyển lên và xuống dốc dễ dàng.


Xin lỗi vì đã không bình luận Tôi đã có một Bộ điều khiển nhân vật thống nhất và tôi đã sử dụng nó nhiều lần, nhưng tôi không thích cách nó hoạt động. Nó phù hợp hơn cho FPS không phải là một trò chơi nền tảng trong đó cơ chế chuyển động là một trong những thứ quan trọng nhất.
Notbad

Tôi nghĩ rằng một khi bạn sử dụng các cài đặt trên Bộ điều khiển nhân vật thì nó hoạt động tốt. Bạn đã thấy thiếu gì?
NoobsAreP People2

Điều đầu tiên tôi không thích là nó chậm so với các cơ thể cứng nhắc thông thường với một số tia. Biết làm thế nào để đạt được nó, tôi nghĩ rằng tôi có thể làm một bộ điều khiển nhẹ hơn. Một vấn đề khác là hành vi kỳ lạ của viên nang / hình cầu ở các cạnh của nền tảng (nó có thể được giải quyết bằng một số phôi tia khác). Đây là lý do tại sao tôi muốn cuộn của riêng tôi.
Notbad

0

nhập mô tả hình ảnh ở đâyTôi cho rằng đó là vì lực không song song với nền tảng và kết quả cuối cùng là thấp hơn khi tăng và cao hơn khi hạ xuống.

Nếu bạn tác dụng một lực tương đối vào hệ tọa độ

AddRelativeForce

Bạn muốn giữ tốc độ tối đa theo "x" và so sánh nó với vô hướng, hãy nhớ rằng tốc độ là một vectơ và kết hợp vx và vy, trong địa hình phẳng vy bằng 0, nhưng nhất thiết trên độ dốc lớn hơn 0.

Vận tốc thay đổi theo hướng của cơ thể, và vx tương đối của nó thay đổi theo vx tổng thể của nó

Điều này có thể sửa đổi V của bạn theo cách bạn không muốn:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

duy trì cùng một Vx toàn cầu có vẻ lạ đối với mắt. (Gia tốc không mong muốn)

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.