
스트림 채팅을위한 공식 Unity SDK.
웹 사이트 | 튜토리얼 | SDK 문서 | API 키 등록

스트림 채팅 SDK는 스트림 채팅을위한 공식 Unity SDK, 채팅 및 메시징 게임 및 응용 프로그램을 구축하기위한 서비스입니다.
IL2CPP가 지원됩니다
WebGL이 지원됩니다
스트림은 대부분의 측면 및 취미 프로젝트에서 무료입니다. 팀원 5 명 미만의 팀원과 월간 수익에서 $ 10,000를 넘지 않는 스트림 채팅을 무료로 사용할 수 있습니다. 당사 웹 사이트를 방문하여 제작자 계정을 신청하십시오.
.unitypackage 를 가져옵니다프로젝트를 설정하고 기본 작업을 수행하는 방법에 대한 자습서를 확인하십시오.
StreamChat/SampleProject 폴더에는 다음과 같은 완전히 작동하는 채팅 예제가 있습니다.

Unity의 UGUI UI 시스템으로 제작되었으며 레거시와 새로운 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] 디렉토리를 제거 할 수 있습니다. 그러나 Newtonsoft JSON 용 Unity 패키지에는 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 구문을 사용하여 호출하거나 .AsCallback() 을 추가하고 다음과 같이 클래식 콜백으로 사용합니다.
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; .AsCallback() 메소드는 두 대의원을 수락합니다 : Action<TResponse> onSuccess 및 Action<Exception> onFailure 가 성공적으로 반응하고 오류 응답 사례에 반응 할 수 있습니다. 대신 Lambda Callbacks는 아래 예제에서와 동일한 서명을 제공 할 수도 있습니다.
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 구문을 사용하여 강력히 조언합니다. 다음 예제에서 알 수 있듯이 코드를 훨씬 간단하고 읽기 쉽고 유지 관리 할 수 있습니다.
연결되면 채널 사용을 시작하여 사용자가 메시지를 보낼 수 있습니다.
채널을 만드는 두 가지 방법이 있습니다.
사용자가 가입 할 수있는 사전 정의 된 채널의 경우. 이것은 범용 채널 또는 클랜, 클럽, 사용자가 가입하거나 떠날 수있는 그룹에 좋습니다.
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 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 ) ; Banning 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 문제를 열면 가능한 빨리 응답하겠습니다.
우리의 지원에 연락하십시오.
우리는 최근 3 천 8 백만 달러의 시리즈 B 자금 조달 라운드를 마감했으며 계속 적극적으로 성장하고 있습니다. 우리의 API는 10 억 명 이상의 최종 사용자가 사용하며 전 세계에서 가장 강력한 엔지니어 팀 내에서 제품에 큰 영향을 줄 수 있습니다. 현재 오프닝을 확인하고 Stream의 웹 사이트를 통해 신청하십시오.