tips – Jake Tee https://jakesto.com Game Dev Blog Sun, 19 Nov 2023 02:53:14 +0000 en-US hourly 1 https://wordpress.org/?v=6.8.1 https://jakesto.com/wp-content/uploads/2022/07/cropped-pngwing.com_-32x32.png tips – Jake Tee https://jakesto.com 32 32 194548219 Tại sao gần đây mình không có bài gì mới https://jakesto.com/tai-sao-gan-day-minh-khong-co-bai-gi-moi/?utm_source=rss&utm_medium=rss&utm_campaign=tai-sao-gan-day-minh-khong-co-bai-gi-moi Sun, 19 Nov 2023 02:53:12 +0000 https://jakesto.com/?p=1000 Xin chào mọi người, mọi người có thể thấy là bài cuối mình viết là từ tháng 3. Trong thời gian qua mình khá bận với việc chưa có ý tưởng để viết bài 😂 Nên nếu mọi người muốn mình viết gì về tính năng hay tips thì cứ comment nhé.

Mình cũng muốn share cho mọi người khóa học tiếng việt Unreal Engine rất chất lượng của một bạn trong nhóm.

https://www.udemy.com/user/brandon-vox/

]]>
1000
101 Tips – Stack Trace https://jakesto.com/101-tips-stack-trace/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-stack-trace Sun, 19 Mar 2023 14:57:30 +0000 https://jakesto.com/?p=980 Khi debug lỗi, hẳn các bạn sẽ không lạ việc tìm kiếm xem hàm đó hoặc sự kiện đó được gọi ở đâu. Trong c++, cách thường làm đó là thêm break point vào dòng code cần xem. Thế còn trong Blueprint thì làm như thế nào?
Câu trả lời là Stack Trace.

Giả sử ta có 1 hàm tên là PrintHelloWorld, chỉ đơn giản là Print String ra màn hình dòng “Hello World” như sau:

Để biết được hàm PrintHelloWorld này được gọi từ object nào, chỉ việc thêm Stack Trace vào nối hàm:

Sau khi hàm PrintHelloWorld được gọi, ta sẽ biết được nguồn gốc của việc gọi đó:

LogBlueprintUserMessages: Script call stack:
Function /Game/Blueprints/BP_MyCharacter.BP_MyCharacter_C:InpActEvt_T_K2Node_InputKeyEvent_0
Function /Game/Blueprints/BP_MyCharacter.BP_MyCharacter_C:ExecuteUbergraph_BP_MyCharacter
Function /Game/Blueprints/BP_MyCharacter.BP_MyCharacter_C:PrintHelloWorld
Function /Game/Blueprints/BP_MyCharacter.BP_MyCharacter_C:ExecuteUbergraph_BP_MyCharacter
LogBlueprintUserMessages: [BP_MyCharacter_C_0] Hello World!

Như ở ví dụ trên, PrintHelloWorld được gọi trong BP_MyCharacter, ở sự kiện ấn nút T.

]]>
980
101 Tips – Mở level kèm tham số https://jakesto.com/101-tips-mo-level-kem-tham-so/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-mo-level-kem-tham-so Sun, 18 Sep 2022 12:55:28 +0000 https://jakesto.com/?p=945 Có nhiều mục đích khi mở level kèm tham số. Ví dụ bạn cần kiểm tra xem level trước đó của người chơi là gì, hoặc chỉ đơn giản là muốn truyền một tham số để khi vừa qua level mới có thể sử dụng ngay.
Có nhiều cách để có thể truyền tham số khi mở một level mới, ví dụ như lưu vào GameInstance, rồi sau khi level đã load xong, ta lấy ra sử dụng. Nhưng thứ thế ta lại phải tạo một hay nhiều biến mới không cần thiết.

Một cách đơn giản đó là ta truyền tham số kèm với khi mở một level mới bằng hàm OpenLevel phổ biến

Nếu bạn không thấy mục Absolute và Options ở dưới, chỉ việc click vào mũi tên để xổ ra.

Vùng Options cho phép ta truyền vào một hay nhiều tham số, được ngăn cách nhau bởi dấu “?”:

?PreviousLevel=MyLevel1?MyScore=20

Ở ví dụ trên, ta sẽ truyền qua Level mới giá trị PreviousLevel (level trước đó) là MyLevel1, MyScore là 20.

Tiếp đến, để sử dụng những tham số vừa truyền, ta vào class GameMode. Nếu bạn chưa biết GameMode là gì, có thể tham khảo lại bài viết này: https://jakesto.com/index.php/2020/03/01/unreal-engine-4-framework-gamemode/

Chuột phải vào Event Graph, và tìm cụm từ Options String, đó chính là đoạn Options mà bạn truyền vào ở trên. Tiếp đó ta chỉ cần Parse đoạn string đó với key tương ứng:

Như vậy đã xong, với cách này, bạn đã có thể thoải mái đem giá trị từ level này sang level khác mà không cần lo việc tạo quá nhiều biến.

]]>
945
101 Tips – Lightning channel https://jakesto.com/101-tips-lightning-channel/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-lightning-channel Sat, 28 May 2022 13:54:06 +0000 https://jakesto.com/?p=895 Có bao giờ bạn muốn đèn chỉ cast ánh sáng lên một số vật thể nhất định trong scene? Hay là chỉ đơn giản là muốn hạn chế ánh sáng cast lên quá nhiều vật thể để tối ưu hiệu năng? Trong Unreal Engine có một tính năng khá hay đó là Lighting Channel.

UE cung cấp cho người dùng 3 channel để sử dụng, và mặc định luôn là Channel 0.

Để thay đổi Lightning Channel, tìm kiếm giá trị Lightning Channel trong vùng Details của ánh sáng, bỏ check Channel 0 và đánh dấu vào Channel 1:

Làm tương tự với các vật thể mà bạn muốn ánh sáng được cast lên. Kết quả ta sẽ có như sau:

Như vậy toàn bộ scene đã không còn được nhận ánh sáng từ DirectionalLight, trừ khối hộp bên trái đã chuyển Lightning Channel sang 1.

]]>
895
Tổng hợp các bài viết ngẫu nhiên https://jakesto.com/tong-hop-bai-viet-random/?utm_source=rss&utm_medium=rss&utm_campaign=tong-hop-bai-viet-random Tue, 03 May 2022 15:18:32 +0000 https://jakesto.com/?p=884 Quy trình

Cách fornite kiểm soát quy trình công việc với UnrealGameSync

Địa ngục render

Cách tối ưu hóa dành cho thiết kế mô đun

Nghệ thuật tối ưu

Sách cầm tay cho người kinh doanh game

Hiệu năng cần thiết cho Valorant

Phát triển, lập trình

Netcode không hiệu quả ra sao

Server 128-tick của Valorant

Sử dụng ChunkDownloader

Stream assets trong C++

Phân tích module network của Unreal Engine (tiếng Trung)

Xây dựng thế giới ở No Man’s Sky sử dụng toán học

Series làm game MMORPG

Khám phá sự bí ẩn của Soft Object Reference

Object Reference là gì

Plugin hỗ trợ giao tiếp với dedicated server thông quan rcon

Mô phỏng trực quan components

Chức năng tạo liên tục thế giới trong No Man’s Sky

Âm thanh

Tại sao tiếng súng trong Call of Duty : Modern Warfare nghe đã vậy

Làm thế nào để tạo tiếng súng hay cho games

Thiết kế, diễn hoạt hình

Plugin convert mixamo sang mannequin cho blender

Shader và gameplay của Valorant

Làm sao để Unreal trông thật và điện ảnh hơn

]]>
884
101 Tips – Format text https://jakesto.com/101-tips-format-text/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-format-text Tue, 29 Mar 2022 14:00:14 +0000 https://jakesto.com/?p=875 Đây là một tip khá hay để có thể format đoạn chữ. Cách phổ biến mọi người hay dùng thường là sử dụng Append String:

Cách này có một hạn chế lớn đó là khi cấu trúc câu trở nên phức tạp thì việc thêm pin vô sẽ rất rườm rà. Thay vào đó ta có thể sử dụng Format Text:

Với cách này, ta có thể thêm pin vào bằng cách sử dụng cú pháp {char} với char có thể là bất cứ kí tự chữ số nào miễn là không trùng nhau.

Ngoài ra, sử dụng Format Text, các đầu nối pin sẽ không phải convert sang dạng String như khi dùng Append String, ta chỉ việc đổi Text thành String sau cùng.

]]>
875
101 Tips – Macro https://jakesto.com/101-tips-macro/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-macro Wed, 23 Mar 2022 12:59:45 +0000 https://jakesto.com/?p=864 Nếu các bạn đã từng thấy một node Blueprint như:

kèm với biểu tượng bánh răng ở góc thì đó chính là một Macro. Công dụng của node trên đó là kiểm tra quyền network của dòng logic đi qua.

Vậy Macro là gì, Macro có thể hiểu đơn giản là một node cho phép người dùng kiểm soát dòng di chuyển logic một cách gọn hơn. Nếu như Function hay Custom Event chỉ có một chiều di chuyển thì Macro có thể có một hoặc nhiều chiều.

Nếu chung ta đúp chuột vào node Switch Has Authority, nó sẽ trông như sau:

Về lí thuyết ta có thể kéo giá trị trả lại từ Has Authority và nối vào Branch để kiểm tra quyền network nhưng nếu phải lặp lại nhiều lần như vậy thì đống dây nối của ta sẽ bị dư thừa nhiều hơn.

Để tạo một Macro, click dấu + trong vùng Macro ở MyBlueprint

Trong ví dụ này mình sẽ làm một Macro kiểm tra xem đầu vào có phải số chẵn hay không.

Trong vùng InputsDetails, lần lượt thêm tham số đầu vào FloatExec. Định dạng Exec chính là một dạng đặc biệt cho phép dòng logic đi qua (hay còn thấy ở mỗi đầu node Blueprint).

Trong vùng Outputs, lần lượt thêm tham số đầu ra Exec cho số chẵn và số lẻ.

Logic thì chỉ đơn giản là kiểm tra số dư khi chia 2, nếu dư thì ta cho dòng logic đi vào nối Even Number và lẻ thì vào Odd Number.

Sau đó chỉ việc kéo ra sử dụng và kết quả khi truyền số 11 vào:

]]>
864
Hướng dẫn làm chức năng quan sát đồ vật trong game kinh dị https://jakesto.com/huong-dan-lam-chuc-nang-quan-sat-do-vat-trong-game-kinh-di/?utm_source=rss&utm_medium=rss&utm_campaign=huong-dan-lam-chuc-nang-quan-sat-do-vat-trong-game-kinh-di Mon, 13 Sep 2021 11:09:43 +0000 https://jakesto.com/?p=831 Do hướng dẫn khá dài và mình cũng lười đánh nên mình làm luôn video :))

Phần 1
Phần 2
Phần 3

Link project :

https://github.com/Long1302/UE4-TutorialProject

]]>
831
101 Tips – 2 – Widget instance editable variables và expose on spawn https://jakesto.com/101-tips-2-widget-instance-editable-variables-va-expose-on-spawn/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-2-widget-instance-editable-variables-va-expose-on-spawn Sat, 26 Sep 2020 09:42:59 +0000 https://jakesto.com/?p=724 Khi tạo một widget và khởi tạo các giá trị, cách thông thường ta hay thấy đó là như sau:

Giả sử ta có 1 widget tên là WBP_Health, và ta muốn khởi tạo giá trị máu ban đầu cho widget

Cách dễ thấy nhất là sau khi tạo widget, ta set thẳng biến InitialHealth được tạo trong WBP_Health.

Cách này sẽ hiệu quả trong nhiều trường hợp, nhưng nếu ví dụ, bạn muốn sau khi set máu ban đầu, bạn sẽ set hiển thị máu lên widget ngay sau đó, khi đó bạn sẽ phải gọi thêm một hàm set máu hiển thị. Có thể là

Với một số bạn quan tâm tới việc gọn gàng, cũng như hạn chế việc nối dây rườm rà, có thể sử dụng Expose on spawn + Instance Editable để khiến mọi thứ gọn hơn. Cụ thể như sau:

Nhớ Save và Compile.

Trong WBP_Health, ta thao tác update ở Event Construct

Lúc này quay lại chỗ Create Widget, ta chỉ cần Refresh Nodes và mọi thứ sẽ thành như sau

Không còn nối dây rườm rà và lo lắng rằng khi UpdateHealth được gọi liệu biến InitialHealth có được set chưa 😀 (dừ 99.69% nó đã được set rồi)

]]>
724
101 Tips – 1 – Benchmark phần cứng người dùng để tìm thiếp lập tương ứng https://jakesto.com/101-tips-1-benchmark-phan-cung-nguoi-dung-de-tim-thiep-lap-tuong-ung/?utm_source=rss&utm_medium=rss&utm_campaign=101-tips-1-benchmark-phan-cung-nguoi-dung-de-tim-thiep-lap-tuong-ung Fri, 25 Sep 2020 13:00:30 +0000 https://jakesto.com/?p=720 Unreal Engine cung cấp sẵn một hàm cho phép ta có thể kiểm tra xem phần cứng mạnh yếu như thế nào để từ đó tìm ra thiết lập đồ họa tương ứng.

Cách gọi hàm như sau:

Sau khi chạy Run Hardware Benchmark, game/app sẽ treo một lúc để chạy benchmark. Sau đó, đằng sau sẽ có 1 giá trị trả lại, mang ý nghĩa độ tốt của máy. Thông thường, nếu giá trị là 100 tức là máy có CPU/GPU tốt.

Từ đó, gọi Apply Hardware Benchmark Results sẽ thực thi áp dụng các thiết lập phù hợp như là độ phân giải bóng, chất lượng hình ảnh,..

Tip trong tips: Bạn có thể kiểm tra điểm hardware máy bạn bằng cách gõ SynthBenchmark vào console.

Các giá trị thiết lập sau đó sẽ được lưu vào ../MyProject/Saved/Config/Windows/GameUserSettings.ini (ScalabilityGroups)

]]>
720