跳到主要內容

精選

對於玩家們常會說的「懷念以前的遊戲」甚至覺得以前的遊戲比較好玩觀點與AI進行探討part1

 接下來針對一些玩家對於很多遊戲習慣會說的以前“ 遊戲比較好玩 ”這點來進行相關的提問 當然我知道我這提問只是一個面向,不過可以看看AI是如和回應的 問題: 有時候,對於遊戲玩家中很常見的一些說法,也覺得有點矛盾,感覺很多人似乎並不是真的理解自己在說些什麼。   像是常常有很多人都喜歡說什麼「懷念以前的遊戲」,或是覺得以前那樣在遊戲中可以做自己想做的事情,覺得很棒,認為現在的遊戲怎麼都只有唯一解,或是只有少數的流派之類的。   但是實際上拆解開來看,以前的遊戲,單純只是因為那時候大家沒有在查攻略玩遊戲而已,難道不是這樣嗎?如果你那時候去查了攻略,不就會發現更好練或是更強的方式,然後就會發現自己在做傻事,結果就是改變自己的玩法。   所以,只要你現在玩家玩新遊戲的時候也都不要查攻略,那你怎麼會覺得只有唯一解?這觀點本身就是有問題的啊。 就是因為你去查了攻略,發現有更好練或是更強的方法,才反而覺得是唯一解不是嗎?   因為照那樣的說法成立,其實現在的新遊戲就不應該開放大家討論,也不要有相關的討論版,任何問那個遊戲的文章都要刪掉,這樣大家就會回到以前那種遊玩模式。 但是,難道大家會想要這樣玩遊戲嗎? 其實現代的遊戲玩家根本就不想那樣玩遊戲啊,結果他們自己的行為根本就是矛盾的,卻整天只會做這種膚淺的言論來抱怨。   如果真的想要玩到更好玩的遊戲,我其實真的覺得,玩家自己本身也是可以提升,甚至帶動整個風氣一起提升不是嗎?而不是只會做那種膚淺的抱怨,卻完全沒說到真正的點上吧。 --- 回應: 「以前遊戲比較自由」這句話,問題出在哪? 你點到一個關鍵: 以前不是沒有唯一解,而是「大家不知道唯一解在哪」 。 為什麼以前看起來比較自由? 沒有現在這麼即時、完整的攻略 沒有 YouTube、Wiki、Discord 秒解 資訊流通慢,玩家彼此之間是「局部知識」 所以結果是: 每個人玩法都不一樣 很多「其實很爛但當下覺得OK」的玩法能存活 玩家會把「不知道更好的解法」誤認成「設計上的自由」 但只要 當年有完整攻略 ,會發生什麼事? 大家一樣會改玩法,一樣會往效率最高的方向靠。 你說得沒錯: 一旦你知道有更快、更強、更省的方式,繼續用...

遊戲伺服器2025年初架設與研究part12將聊天室內容顯示在Unity的Game視窗(遊戲視窗)

 那首先回顧一下上次的內容

上次我們已經簡單的建立了登入(無驗證)

並且讓聊天訊息可以發送出去了

那大家應該也有注意到

我們上次只是把訊息印在log

實際上遊戲畫面是什麼反應都沒有的

這次我們就是要來把遊戲畫面中的機制給簡單的處理一下


那首先我們先注意一下目前Game視窗的內容

假設也是有顯示No Cameras rendering

那就是先給他新增一個Camera,這樣這提示訊息就不會擋在這了

不過這邊如果大家建立場景的時候是選Basic而不是選空場景

那種情況預設就會有一台攝影機,所以不用做這個操作


我們在Hierarchy點右鍵,建立Camera
不過攝影機上的東西跟這次無關
單純只是讓先前的提示訊息不要顯示而已

接下來我們要來簡單的布置一下目前的UI配置
讓我們的聊天室內容可以顯示出來
在UI這邊建立空物件




先簡單的建立出這幾個物件
目前都是空物件,我們等等才會開始給物件加上功能
名字可以參考,也可以自己取



接下來我們先到專案內新增兩個C#腳本
分別是ChatMessage跟ChatMessageUnit


接下來我們先把這兩個腳本掛物件上

掛上去之後我們再開始寫功能

首先是我們的ChatMessage

using System.Collections.Generic;
using UnityEngine;

public class ChatMessage : MonoBehaviour
{

	//複製用的聊天訊息物件
	public ChatMessageUnit m_cloneObj = null;
	//複製的物件的父物件
	public Transform m_gridNode = null;


	public void RefreshChatUi(string addText)
	{
		ChatMessageUnit unit = Instantiate(m_cloneObj, m_gridNode);
		unit.RefreshData(addText);
	}
}



接下來是ChatMessageUnit

using TMPro;
using UnityEngine;

public class ChatMessageUnit : MonoBehaviour
{

	public TMP_Text chatText = null;

	public void RefreshData(string content)
	{
		chatText.text = content;
	}




}



主要在ChatMessage中準備了一個負責收到聊天訊息,並且透過收到的聊天訊息來創造物件
創造好物件後放置於指定的父物件底下,然後處理刷新
那ChatMessageUnit就是準備一個可以被刷新Text的Function

寫好把腳本存檔,我們回到Unity繼續後面的操作



首先我們先在Grid物件上新增一個腳本(Component)
這個腳本是Unity內建的,叫做Grid Layout Group
我們點選物件底下的Add Component
會出現搜尋的框,接下來輸入grid
通常如果專案內沒有其他grid腳本的話,會是第二個
選擇後就可以加入
這邊我是簡單的調整了一下物件具體的位置



並且在場景中大約在左下角的位置(相對於UI整體版面)


接下來我們到MessageUnit物件底下新增一個物件(畫面上是已經新增好的)
要新增的話如下圖的操作就可以創建

這樣我們就可以把這個Text給創建出來


接下來我們要把剛剛腳本宣告的物件給拉上來
MessageUnit下方的Script,把剛剛我們創建好的Text(TMP)給丟到ChatText的欄位


接下來我們回到上層,也就是MessageNode這層
把我們ChatMessage剛剛宣告的物件也一併拉上
主要就是CloneObj拉上我們的MessageUnit
而底下的GridNode拉上我們的MessageGrid物件

接下來為了測試
我們先把HideObj關起來
避免影響測試


先把物件旁邊的勾給取消,這樣可以暫時隱藏這個物件
接下來我們還要處理先前的Websocket腳本

using System;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using NativeWebSocket;

[Serializable]
public class ClientPacket
{
	public string type;
	public string username;
	public string message;
}

[Serializable]
public class ServerPacket
{
	public string type;
	public string message;
}

public class WebSocketClient : MonoBehaviour
{
	private WebSocket websocket;

	public ChatMessage chatMessage;

	// 設定伺服器位址
	[SerializeField]
	private string serverUrl = "ws://localhost:8765";

	private async void Start()
	{
		websocket = new WebSocket(serverUrl);

		websocket.OnOpen += OnOpen;
		websocket.OnError += OnError;
		websocket.OnClose += OnClose;
		websocket.OnMessage += OnMessage;

		await websocket.Connect();
	}

	private void Update()
	{
#if !UNITY_WEBGL || UNITY_EDITOR
		websocket?.DispatchMessageQueue();
#endif
	}

	private void OnApplicationQuit()
	{
		websocket?.Close();
	}

	private void OnOpen()
	{
		Debug.Log("WebSocket opened.");
	}

	private void OnError(string errorMsg)
	{
		Debug.LogError("WebSocket error: " + errorMsg);
	}

	private void OnClose(WebSocketCloseCode closeCode)
	{
		Debug.Log("WebSocket closed with code: " + closeCode);
	}

	private void OnMessage(byte[] bytes)
	{
		string json = Encoding.UTF8.GetString(bytes);
		try
		{
			ServerPacket packet = JsonUtility.FromJson<ServerPacket>(json);
			switch (packet.type)
			{
				case "welcome":
					Debug.Log(packet.message);
					break;
				case "chat":
					Debug.Log("Chat: " + packet.message);
					chatMessage.RefreshChatUi(packet.message);
					break;
				default:
					Debug.LogWarning($"Unknown packet type: {packet.type}");
					break;
			}
		}
		catch (Exception e)
		{
			Debug.LogError("Failed to parse server packet: " + e);
		}
	}

	public async Task SendLogin(string username)
	{
		ClientPacket packet = new ClientPacket
		{
			type = "login",
			username = username
		};
		string json = JsonUtility.ToJson(packet);
		await websocket.SendText(json);
	}

	public async Task SendChat(string message)
	{
		ClientPacket packet = new ClientPacket
		{
			type = "chat",
			message = message
		};
		string json = JsonUtility.ToJson(packet);
		await websocket.SendText(json);
	}
}



那我把有修改的部分進行了粗體跟加大顯示,並提供完整內容方便對照
主要就只有修改兩行


調整完之後,回到我們Unity場景中
把Manager掛上的腳本也拉上來
也就是把MessageNode給拉到ChatMessage的位置


那為了方便對位,我也給一張目前Game視窗的UI版面圖
左下角是Chat跟其輸入框
右上角是Login跟其輸入框

接下來我們就可以執行遊戲來測試了
先點擊上方Unity的Play
操作與上次相同
我們先登入,在右上方的登入框內輸入名稱
接下來在左下角的聊天框中輸入想要輸入的字
預設只有英文字體,不過我這邊是先使用了google的免費字體
所以讓這邊可以簡單地顯示出中文字了

如果繼續輸入的話,這邊字就會繼續往上


這樣子我們就可以簡單的把聊天室內容顯示在遊戲視窗上了
大家也可以以此為基礎新增更多功能
並且這也是伺服器回傳的資料進行顯示,我們也可以帶更多資料,來做更詳細的處理
同樣的這也表示目前就能多台遊戲端可以同步顯示聊天訊息在遊戲視窗上了
也可以自己複製一個專案,透過另一個Unity進行兩邊交叉測試
那這次就先分享到這邊,如有疑問也可以提出~







留言