[Thắc mắc] Về vị trí của Trail Renderer

doreamonhihidoreamonhihi Posts: 38Registered
edited December 2019 in Unity
Chào mọi người, em đang tập làm hiệu ứng chém chuối (hay chém hoa quả), nhưng mà có 1 vấn đề liên quan đến vị trí của cái hiệu ứng đấy.
Ví dụ như e đặt ngón tay từ vị trí A đến vị trí B, sau đó bỏ tay ra, đặt ngón tay di chuyển từ vị trí C đến vị trí D. Trên lí thuyết thì đúng ra chỉ có hiện ra tia AB và tia CD thôi, nhưng thực tế thì nó hiện ra cả tia BC. Hình minh họa như dưới đây:
Như mọi người dã thấy cái tia đỏ kia là cái hiệu ứng nó bị thừa ra không cần thiết, em có tham khảo về hiện tượng này thấy hướng dẫn là dùng hàm clear, nhưng có vẻ vẫn không hiệu quả. Còn 1 hướng dẫn khác nữa là set time về 0 khi không làm gì nữa, xong lúc nào cần dùng lại thì lại set time của blade trail về một số >0. Em cũng đã thử nhưng test thì thấy vẫn không hiệu quả mà còn lag hơn . Thử active xong deactive hay Instantiate cũng vô dụng (hoặc có thể các cách trên em áp dụng sai :( )

Cụ thể em làm theo hướng dẫn dưới đây:


Em gán trail renderer vào 1 object (gọi là blade), khi di chuyển ngón tay hoặc chuột thì blade đấy di chuyển, tạo thành hiệu ứng slice như trong game chém hoa quả ._.
Hóng cao nhân giải đáp, em cảm ơn :)


Comments

  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Trail được thiết kết là liền mạch, nó không thể bị đứt quãng được, nên nó phải nối lại là đúng rồi.
    Để giải quyết cái này thì em tạo nhiều object Trail khác nhau, AB và CD là 2 object độc lập, thì sẽ không bị nữa. 
    Tức là mỗi khi người chơi đặt tay xuống thì em Instantiate 1 Trail mới, Trail cũ thì cho tự động Destroy sau 1 khoảng thời gian.
  • doreamonhihidoreamonhihi Posts: 38Registered
    Dang_Khoa said:
    Trail được thiết kết là liền mạch, nó không thể bị đứt quãng được, nên nó phải nối lại là đúng rồi.
    Để giải quyết cái này thì em tạo nhiều object Trail khác nhau, AB và CD là 2 object độc lập, thì sẽ không bị nữa. 
    Tức là mỗi khi người chơi đặt tay xuống thì em Instantiate 1 Trail mới, Trail cũ thì cho tự động Destroy sau 1 khoảng thời gian.

    Có thể dùng particle effect mà tạo ra hiệu ứng tương tự như trail renderer không nhỉ (lúc di chuyển cũng để lại 1 vệt, với cả em thấy nếu thay đổi vị trí bất ngờ kiểu teleport thì không bị tạo thành vệt kéo dài như trail) :)
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Particle cũng được, lưu ý trong phần emission chỉnh cho nó tạo particle theo distance ấy, khi đó nếu di chuột nhanh thì nó vẫn tạo :3
  • doreamonhihidoreamonhihi Posts: 38Registered
    edited January 2020
    Dang_Khoa said:
    Particle cũng được, lưu ý trong phần emission chỉnh cho nó tạo particle theo distance ấy, khi đó nếu di chuột nhanh thì nó vẫn tạo :3

    Huhu em thử để over distance, làm theo hướng dẫn ở đây vẫn bị hiện tượng như trên ạ :(
    https://www.youtube.com/watch?v=agr-QEsYwD0
    Nếu làm như trong này có cần phải sửa lại gì không hả ad :(
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Trước khi di chuyển qua chỗ mới thì tắt cái GameObject đi, qua chỗ mới thì mới bật nó lên lại  ;)
  • doreamonhihidoreamonhihi Posts: 38Registered
    edited January 2020
    Dang_Khoa said:
    Trước khi di chuyển qua chỗ mới thì tắt cái GameObject đi, qua chỗ mới thì mới bật nó lên lại  ;)
    Edit:
    Em sửa được r

    Chia 4 phase:

    Begin

    Moved

    Ended

    Canceled

    Ở phase Begin tạm thời instantiate 1 cái mới từ prefab
    Sau đó move cái prefab theo vị trí cái blade

    Xong ở phase moved thì tiếp tục thực hiện như thế

    Như thế sẽ ẩn đi cái quá trình di chuyển :)


  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Đâu gửi code lên anh xem thử nào :)
  • doreamonhihidoreamonhihi Posts: 38Registered
    edited January 2020
    Dang_Khoa said:
    Đâu gửi code lên anh xem thử nào :)
              
    switch(phase)
    {
    case TouchPhase.Began:
                        first_id = touch.fingerId;
                        PreviousPosition = cam.ScreenToWorldPoint(touch.position);
                        CurrentBlade = Instantiate(BladeParticlePrefab, transform.position, Quaternion.identity);
                        CurrentBlade.transform.position = cam.ScreenToWorldPoint(touch.position);
                        circle_collider.enabled = false;        
                        break;
                    case TouchPhase.Moved:
                        current_id = touch.fingerId;
                        if (current_id == first_id)
                        {
                            Vector2 NewPosition = cam.ScreenToWorldPoint(touch.position);
                            gameObject.transform.position= NewPosition;
                            CurrentBlade.transform.position = NewPosition;
                            float Velocity = (NewPosition - PreviousPosition).magnitude / Time.deltaTime;
                            if (Velocity > min_velocity)
                            {
                                circle_collider.enabled = true;
                            }
                            else
                                circle_collider.enabled = false;
                            PreviousPosition = NewPosition; 
                        }
                        break;
                    case TouchPhase.Ended:
                        Destroy(CurrentBlade);
                        circle_collider.enabled = false;
                        break;
                    case TouchPhase.Canceled:
                        circle_collider.enabled = false;
                        break;
                } }

    Thêm đúng dòng thứ 4 ở phase begin là không cần phải active hay deactive cái gì nữa ^_^

    Mỗi tội là cứ phải instantiate với destroy ntn không biết liệu có ảnh hưởng đến hiệu năng nhiều không, em thử không instantiate với destroy mà thay vào đó là gán cái prefab kia như là object con của blade thì lại không được (làm như thế lúc check trên màn hình thấy cái blade với cái prefab vị trí nó lệch nhau mà không hiểu tại sao @.@ )
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Cách của em cũng ổn rồi, chỉ cần sửa lại một chút, thay vì instantiate và destroy thì có thể dùng kĩ thuật pooling để tối ưu, em dùng asset Lean Pool ấy, cái đó anh thấy dùng tốt và đang dùng :lol:  

    À góp ý cách đặt tên biến ko chuẩn của C# nha ;)
  • doreamonhihidoreamonhihi Posts: 38Registered
    Dang_Khoa said:
    Cách của em cũng ổn rồi, chỉ cần sửa lại một chút, thay vì instantiate và destroy thì có thể dùng kĩ thuật pooling để tối ưu, em dùng asset Lean Pool ấy, cái đó anh thấy dùng tốt và đang dùng :lol:  

    À góp ý cách đặt tên biến ko chuẩn của C# nha ;)

    Đặt tên biến không chuẩn của C# là sao nhỉ, em từ bên C/C++ chuyển sang vẫn code theo thói quen :blush:
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Em tham khảo cái này để viết cho đúng nè, vì ai cũng theo chuẩn nên em viết lệch chuẩn sẽ lộn xộn lắm :3

    https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines
Sign In or Register to comment.