
SDK Unity อย่างเป็นทางการสำหรับการแชทสตรีม
เว็บไซต์ | การสอน เอกสาร SDK | ลงทะเบียนสำหรับคีย์ API

สตรีมแชท SDK เป็น Unity SDK อย่างเป็นทางการสำหรับสตรีมแชทบริการสำหรับการสร้างเกมแชทและเกมส่งข้อความและแอปพลิเคชัน
รองรับ IL2CPP
รองรับ WebGL
สตรีมฟรีสำหรับโครงการด้านข้างและงานอดิเรกส่วนใหญ่ คุณสามารถใช้แชทสตรีมได้ฟรีโดยมีสมาชิกในทีมน้อยกว่าห้าคนและไม่เกิน $ 10,000 ในรายได้ต่อเดือน เยี่ยมชมเว็บไซต์ของเราและสมัครบัญชีผู้ผลิต
.unitypackage ที่ดาวน์โหลดตรวจสอบการสอนของเราเกี่ยวกับวิธีการตั้งค่าโครงการของคุณและดำเนินการพื้นฐาน
ในโฟลเดอร์ StreamChat/SampleProject คุณจะพบตัวอย่างแชทที่ทำงานได้อย่างสมบูรณ์ซึ่งมี:

สร้างขึ้นด้วยระบบ UGUI UI ของ Unity และรองรับทั้งมรดกและระบบอินพุตของ Unity ใหม่
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene และกดเล่นจะเปิดใช้งาน ระบบอินพุตใหม่ ของ Unity ได้อย่างไร:
Multiple precompiled assemblies with the same name Newtonsoft.Json.dll included or the current platform. Only one assembly with the same name is allowed per platform.
คุณสามารถลบ [email protected] ไดเรกทอรี โปรดทราบว่าแพ็คเกจ Unity's Package สำหรับ Newtonsoft JSON มีการสนับสนุน IL2CPP หากคุณต้องการแทนที่และยังคงใช้ IL2CPP ตรวจสอบให้แน่ใจว่าการใช้งาน JSON ที่คุณเลือกนั้นรองรับ IL2CPP เช่นกัน
นี่คือตัวอย่างรหัสด่วนที่จะเริ่มต้น สำหรับข้อมูลโดยละเอียดโปรดตรวจสอบเอกสารของเรา
StreamChatClient - ตัวจัดการแชทหลักที่ช่วยให้คุณเชื่อมต่อกับเซิร์ฟเวอร์แชทสตรีมสร้างช่องสัญญาณการสืบค้นผู้ใช้และสมาชิกตามเกณฑ์ที่ให้ไว้StreamChannel - ผู้ใช้กลุ่มช่องในการสนทนา ขึ้นอยู่กับการตั้งค่าของคุณผู้ใช้อาจจำเป็นต้องเข้าร่วมช่องเป็นสมาชิกเพื่อส่งข้อความStreamUser - เป็นตัวแทนผู้ใช้รายเดียวภายในแอปพลิเคชันของคุณStreamChannelMember - วัตถุที่เป็นตัวแทนของผู้ใช้ที่เป็นสมาชิกของช่องเฉพาะ วัตถุนี้มี member.User คุณสมบัติผู้ใช้เพื่อเข้าถึงวัตถุผู้ใช้StreamMessage - แสดงข้อความเดียวภายในช่อง ผู้ใช้ StreamChatClient.CreateDefaultClient(); วิธีการโรงงานเพื่อสร้างอินสแตนซ์ของ IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}วิธีที่ง่ายที่สุดในการเริ่มต้นคือการเปิดใช้งานการอนุญาตจากนักพัฒนา
var userId = StreamChatClient . SanitizeUserId ( "user-name" ) ;
var userToken = StreamChatClient . CreateDeveloperAuthToken ( userId ) ;
// Replace API_KEY with your Api Key from the Stream Dashboard
var localUserData = await Client . ConnectUserAsync ( "API_KEY" , userId , userToken ) ; ทุกฟังก์ชั่นที่รอการตอบกลับจากเซิร์ฟเวอร์คุณสามารถโทรหา C# Modern Async/Await Wyntax หรือต่อท้าย .AsCallback() และใช้เป็น callback คลาสสิกดังนี้:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; เมธอด .AsCallback() ยอมรับผู้ได้รับมอบหมายสองคน: Action<TResponse> onSuccess และ Action<Exception> onFailure ที่คุณสามารถใช้เพื่อตอบสนองต่อกรณีการตอบกลับที่ประสบความสำเร็จและข้อผิดพลาด แทนการโทรกลับของแลมบ์ดาคุณยังสามารถให้วิธีการที่มีลายเซ็นเดียวกันกับในตัวอย่างด้านล่าง:
public void ConnectUser ( )
{
var userId = StreamChatClient . SanitizeUserId ( "user-name" ) ;
var userToken = StreamChatClient . CreateDeveloperAuthToken ( userId ) ;
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( OnUserConnected , OnUserConnectionFailed ) ;
}
private void OnUserConnected ( IStreamLocalUserData localUserData )
{
Debug . Log ( "User connected: " + localUserData . User . Name ) ;
}
private void OnUserConnectionFailed ( Exception exception )
{
Debug . LogException ( exception ) ;
} เราให้คำแนะนำอย่างยิ่งว่าการใช้ไวยากรณ์ async/await ซึ่งตามที่คุณจะสังเกตเห็นในตัวอย่างต่อไปนี้ทำให้รหัสง่ายขึ้นและง่ายขึ้นในการอ่านและบำรุงรักษา
เมื่อคุณเชื่อมต่อคุณสามารถเริ่มใช้ช่องเพื่อให้ผู้ใช้สามารถส่งข้อความได้
มี 2 วิธีในการสร้างช่องทาง:
สำหรับช่องที่กำหนดไว้ล่วงหน้าซึ่งผู้ใช้สามารถเข้าร่วมได้ นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับช่องทางวัตถุประสงค์ทั่วไปหรือกลุ่มคลับกลุ่มที่ผู้ใช้สามารถเข้าร่วมหรือออกได้
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;หรือด้วยการโทรกลับ:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; เหมาะสำหรับข้อความกลุ่มสาธารณะหรือส่วนตัวลำดับของผู้ใช้ในกลุ่มไม่สำคัญดังนั้นเมื่อใดก็ตามที่ผู้ใช้เชื่อมต่อโดยใช้วิธีนี้พวกเขาจะเห็นประวัติการแชทของพวกเขาเสมอ:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; ในการเรียกดูช่องหรือช่องทั้งหมดที่กรองโดยเกณฑ์บางอย่างใช้ Client.QueryChannelsAsync
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . Cid . In ( "channel-cid" , "channel-2-cid" , "channel-3-cid" )
} ;
var sort = ChannelSort . OrderByAscending ( ChannelSortFieldName . CreatedAt ) ;
var channels = await Client . QueryChannelsAsync ( filters , sort ) ;กลไกการกรองนั้นทรงพลังมากและช่วยให้คุณสามารถรวมกฎหลายข้อเข้าด้วยกัน คุณสามารถตรวจสอบรายการทั้งหมดของฟิลด์ที่มีอยู่และตัวดำเนินการที่คุณสามารถใช้สำหรับการสืบค้นแชนเนลได้ที่นี่
// Each operator usually supports multiple argument types to match your needs
ChannelFilter . Cid . EqualsTo ( "channel-cid" ) ; // string
ChannelFilter . Cid . EqualsTo ( channel ) ; // IStreamChannel
ChannelFilter . Cid . In ( "channel-cid" , "channel-2-cid" , "channel-3-cid" ) ; // Comma separated strings
var channelCids = new List < string > { "channel-1-cid" , "channel-2-cid" } ;
ChannelFilter . Cid . In ( channelCids ) ; // Any collection of string var filters = new IFieldFilterRule [ ]
{
ChannelFilter . CreatedById . EqualsTo ( Client . LocalUserData . User )
} ; var filters = new IFieldFilterRule [ ]
{
ChannelFilter . MembersCount . GreaterThan ( 10 )
} ; var weekAgo = DateTime . Now . AddDays ( - 7 ) . Date ;
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . CreatedAt . GreaterThan ( weekAgo )
} ; var dayAgo = DateTime . Now . AddHours ( - 24 ) ;
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . UpdatedAt . GreaterThan ( dayAgo )
} ; ข้อความสามารถเข้าถึงได้ผ่านคุณสมบัติ channel.Messages ที่มีการรวบรวมข้อความล่าสุด เนื่องจากมีข้อความหลายพันข้อความในประวัติช่องสัญญาณ channel.Messages มีเพียงข้อความล่าสุดเท่านั้น คุณสามารถโหลดข้อความเก่า ๆ ได้โดยเรียก channel.LoadOlderMessagesAsync() ซึ่งจะโหลดส่วนเพิ่มเติมของประวัติ วิธีการทั่วไปคือการโทรหา channel.LoadOlderMessagesAsync() เมื่อใดก็ตามที่ผู้ใช้พบจุดสิ้นสุดของมุมมองการเลื่อนข้อความของคุณวิธีนี้คุณจะโหลดข้อความเก่า ๆ เมื่อผู้ใช้ต้องการดู คุณสามารถดูตัวอย่างของวิธีการนี้ในตัวอย่างของโครงการ MessageListView.cs
var sentMessage = await channel . SendNewMessageAsync ( "Hello" ) ; var messageInThread = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
ParentId = parentMessage . Id , // Write in thread
ShowInChannel = false , // Optionally send to both thread and the main channel like in Slack
Text = "Hello" ,
} ) ; var messageWithQuote = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
QuotedMessage = quotedMessage , // Reference to IStreamMessage
Text = "Hello" ,
} ) ;ข้อความเงียบไม่ได้กระตุ้นเหตุการณ์สำหรับสมาชิกช่อง มักใช้สำหรับข้อความระบบ
var silentMessage = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
Text = "System message" ,
Silent = true
} ) ; await message . PinAsync ( ) ; await message . PinAsync ( new DateTime ( ) . AddDays ( 7 ) ) ; // Pin for 7 days await message . UnpinAsync ( ) ; await message . UpdateAsync ( new StreamUpdateMessageRequest
{
Text = "New changed message" ,
} ) ; await message . UpdateAsync ( new StreamUpdateMessageRequest
{
CustomData = new StreamCustomDataRequest
{
{ "CategoryId" , 12 } ,
{ "Awards" , new string [ ] { "Funny" , "Inspirational" } }
}
} ) ;ล้างข้อความเท่านั้น แต่ทิ้งข้อมูลอื่น ๆ ปฏิกิริยาปฏิกิริยาข้อความย่อยเธรด ฯลฯ
await message . SoftDeleteAsync ( ) ; ลบข้อความอย่างสมบูรณ์และลบข้อมูลทั้งหมดที่เกี่ยวข้องกับข้อความนี้
await messageInChannel . HardDeleteAsync ( ) ; await message . SendReactionAsync ( "like" ) ; await message . SendReactionAsync ( "clap" , 10 ) ; await message . SendReactionAsync ( "love" , enforceUnique : true ) ; await message . DeleteReactionAsync ( "like" ) ; // Get file byte array however you want e.g. Addressables.LoadAsset, Resources.Load, etc.
var sampleFile = File . ReadAllBytes ( "path/to/file" ) ;
var fileUploadResponse = await channel . UploadFileAsync ( sampleFile , "my-file-name" ) ;
var fileWebUrl = fileUploadResponse . FileUrl ; var sampleImage = File . ReadAllBytes ( "path/to/file" ) ;
var imageUploadResponse = await channel . UploadImageAsync ( sampleFile , "my-image-name" ) ;
var imageWebUrl = imageUploadResponse . FileUrl ; var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , channelId : "my-channel-id" ) ;
await channel . DeleteFileOrImageAsync ( "file-url" ) ; วัตถุช่องจะได้รับการอัปเดตโดยอัตโนมัติเมื่อใดก็ตามที่การเปลี่ยนแปลงใด ๆ เกิดขึ้น (ข้อความใหม่ปฏิกิริยา ฯลฯ ) คุณสามารถตอบสนองต่อการเปลี่ยนแปลงเหล่านี้ได้โดยการสมัครรับกิจกรรมที่เปิดเผย IStreamChannel :
channel . MessageReceived += OnMessageReceived ;
channel . MessageUpdated += OnMessageUpdated ;
channel . MessageDeleted += OnMessageDeleted ;
channel . ReactionAdded += OnReactionAdded ;
channel . ReactionUpdated += OnReactionUpdated ;
channel . ReactionRemoved += OnReactionRemoved ; var localUserData = Client . LocalUserData ;
var localUser = localUserData . User ;StreamUser แสดงถึงผู้ใช้บนอุปกรณ์ท้องถิ่น var users = await Client . QueryUsersAsync ( ) ; var users = await Client . QueryUsersAsync ( new Dictionary < string , object > ( )
{
{
"id" , new Dictionary < string , object >
{
{ "$eq" , otherUserId }
}
}
} ) ;
var otherUser = users . First ( ) ; var filters = new Dictionary < string , object >
{
{
"id" , new Dictionary < string , object >
{
{
"$in" , listOfUserIds
}
}
}
} ;
var users = await Client . QueryUsersAsync ( filters ) ;อ่านเพิ่มเติมเกี่ยวกับพารามิเตอร์และตัวดำเนินการแบบสอบถามที่รองรับ
ขึ้นอยู่กับผู้ใช้การกำหนดค่าแอปของคุณอาจจำเป็นต้องเข้าร่วมช่องเป็นสมาชิกเพื่อส่งข้อความหรือดูข้อความผู้ใช้รายอื่น
// Multiple overloads available depending on your needs
await channel . AddMembersAsync ( user ) ; // instance of IStreamUser
await channel . AddMembersAsync ( user1 , user1 ) ; // Multiple instances of IStreamUser
await channel . AddMembersAsync ( listOfUsers ) ; // List<IStreamUser>
await channel . AddMembersAsync ( "user-id" ) ; // string ID
await channel . AddMembersAsync ( listOfUserIds ) ; // List<string> that contains IDs // Multiple overloads available depending on your needs
await channel . RemoveMembersAsync ( member ) ; // instance of IStreamChannelMember
await channel . RemoveMembersAsync ( member1 , member2 ) ; // Multiple instances of IStreamChannelMember
await channel . RemoveMembersAsync ( listOfMembers ) ; // List<IStreamChannelMember>
await channel . RemoveMembersAsync ( user ) ; // instance of IStreamUser
await channel . RemoveMembersAsync ( user1 , user1 ) ; // Multiple instances of IStreamUser
await channel . RemoveMembersAsync ( listOfUsers ) ; // List<IStreamUser>
await channel . RemoveMembersAsync ( "user-id" ) ; // string ID
await channel . RemoveMembersAsync ( listOfUserIds ) ; // List<string> that contains IDsสตรีมมีเครื่องมือและคุณสมบัติที่จำเป็นทั้งหมดเพื่อจัดการชุมชนขนาดใหญ่อย่างเหมาะสม
การตั้งค่าสถานะหมายความว่าผู้ใช้หรือข้อความนี้จะถูกรายงานไปยังการแก้ไขการแชท แชทผู้ดูแลระบบและผู้ดูแลสามารถดูผู้ใช้ที่รายงานและข้อความในแผงควบคุม
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; การห้าม IP ช่วยป้องกันกรณีที่ผู้ใช้สร้างบัญชีใหม่เพื่อข้ามการห้าม
await channel . BanUserAsync ( user , timeoutMinutes : 120 , isIpBan : true ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; var request = new StreamQueryBannedUsersRequest
{
CreatedAtAfterOrEqual = new DateTimeOffset ( ) . AddHours ( - 24 ) ,
Limit = 30 ,
Offset = 0 ,
} ;
var bannedUsersInfo = await Client . QueryBannedUsersAsync ( request ) ;ผู้ใช้ Shadow Banned ไม่ทราบว่าเขาถูกแบน บางครั้งสิ่งนี้มีประโยชน์เพราะต้องใช้เวลาเพิ่มเติมสำหรับผู้ใช้ในการตระหนักถึงเขาถูกแบน
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;ตัวอย่างข้างต้นมีเพียงไม่กี่คนเท่านั้น - ตรวจสอบเอกสารฉบับเต็มของเราเพื่อดูข้อมูลเชิงลึกและตัวอย่างเพิ่มเติม
ไปข้างหน้าและเปิดปัญหา GitHub ด้วยคำขอของคุณแล้วเราจะตอบกลับโดยเร็วที่สุด
เอื้อมมือไปสนับสนุน
เมื่อเร็ว ๆ นี้เราได้ปิดการระดมทุนรอบ 38 ล้านเหรียญสหรัฐและเรายังคงเติบโตอย่างแข็งขัน API ของเราถูกใช้โดยผู้ใช้ปลายทางมากกว่าพันล้านคนและคุณจะมีโอกาสสร้างผลกระทบอย่างมากต่อผลิตภัณฑ์ภายในทีมวิศวกรที่แข็งแกร่งที่สุดทั่วโลก ตรวจสอบช่องเปิดปัจจุบันของเราและสมัครผ่านเว็บไซต์ของสตรีม