
ストリームチャットの公式Unity SDK。
ウェブサイト|チュートリアル| SDKドキュメント| APIキーに登録します

Stream Chat SDKは、チャットやメッセージングゲームやアプリケーションを構築するためのサービスであるStream Chatの公式Unity SDKです。
IL2CPPがサポートされています
WebGLがサポートされています
ストリームは、ほとんどの側面および趣味のプロジェクトで無料です。 5人未満のチームメンバーで無料でストリームチャットを使用して、毎月の収益が10,000ドル以下で使用できます。当社のウェブサイトにアクセスして、メーカーアカウントを申請してください。
.unitypackageをインポートしますプロジェクトのセットアップと基本操作の実行方法に関するチュートリアルをご覧ください。
StreamChat/SampleProjectフォルダーには、完全に機能するチャットの例があります。

UnityのUGUI UIシステムで作成され、レガシーと新しいUnityの入力システムの両方をサポートします。
StreamChat/SampleProject/Config/DemoCredentials.assetにStreamChat/SampleProject/Scenes/ChatDemo.sceneとHit PlayUnityの新しい入力システムを有効にする方法は?:
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 -Stream Chat Serverに接続し、チャネル、クエリチャネル、ユーザー、および提供された基準に基づいてメンバーを作成できるメインチャットマネージャーStreamChannel -Channels Groupユーザーは会話をします。設定に応じて、ユーザーはメッセージを送信するためにメンバーとしてチャンネルに参加する必要がある場合がありますStreamUserアプリケーション内の単一のユーザーを表しますStreamChannelMember特定のチャネルのメンバーであるユーザーを表すオブジェクト。このオブジェクトには、ユーザーオブジェクトにアクセスするためのプロパティmember.Userが含まれていますStreamMessageチャネル内の単一のメッセージを表しますユーザーthe 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/Waing Syntaxを使用して呼び出すか、 .AsCallback()を追加し、次のようにクラシックコールバックとして使用できます。
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; .AsCallback()メソッドは、2人の代表者を受け入れます。 Action<TResponse> onSuccessとAction<Exception> onFailureは、成功とエラー応答ケースの両方に対応するために使用できます。代わりに、Lambdaコールバックは、以下の例と同じ署名でメソッドを提供することもできます。
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 Syntaxを使用して強くアドバイスします。これは、次の例で気付くように、コードをよりシンプルで読みやすくしやすくします。
接続したら、ユーザーがメッセージを送信できるようにチャネルの使用を開始できます。
チャネルを作成するには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を使用します。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()を呼び出すことです。ユーザーがメッセージのスクロールビューの最後にヒットするたびに、ユーザーが実際に表示したい場合にのみ古いメッセージをロードします。サンプルプロジェクトのmesageListview.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 IDsStreamは、大規模なコミュニティを適切に管理するために必要なすべてのツールと機能を提供します。
フラグは、このユーザーまたはメッセージがチャットモデレートに報告されることを意味します。チャット管理者とモデレーターは、報告されたユーザーとメッセージをダッシュボードで表示できます。
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 ) ;シャドウ禁止ユーザーは、彼が禁止されていることを知りません。これは、ユーザーが彼が禁止されていることを理解するのにさらに時間がかかるため、時には役立つことがあります。
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;上記の例は、多くのうちの数だけです - より多くの洞察と例については、私たちの完全なドキュメントをチェックしてください
先に進んで、お客様のリクエストでGitHubの問題を開き、できるだけ早く応答します。
私たちのサポートに手を差し伸べてください。
最近、3800万ドルのシリーズBの資金調達ラウンドを閉鎖し、積極的に成長し続けています。私たちのAPIは10億人以上のエンドユーザーによって使用されており、世界中の最も強力なエンジニアのチーム内で製品に大きな影響を与える機会があります。現在のオープニングをチェックして、StreamのWebサイトで申請してください。