
Le SDK Unity officiel pour le chat en flux.
Site Web | Tutoriel | Documentation SDK | Inscrivez-vous à la clé API

Le Stream Chat SDK est le SDK Unity officiel pour Stream Chat, un service pour construire des jeux de chat et de messagerie et des applications.
IL2CPP est pris en charge
WebGL est pris en charge
Stream est gratuit pour la plupart des projets secondaires et de passe-temps. Vous pouvez utiliser Stream Chat gratuitement avec moins de cinq membres de l'équipe et pas plus de 10 000 $ en revenus mensuels. Visitez notre site Web et demandez le compte des créateurs.
.unitypackage téléchargéConsultez notre didacticiel sur la façon de configurer votre projet et d'effectuer des opérations de base.
Dans le dossier StreamChat/SampleProject vous trouverez un exemple de chat entièrement fonctionnel avec:

Créé avec le système d'interface utilisateur UGUI d'Unity et prend en charge à la fois l'héritage et le système d'entrée de New Unity.
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene et appuyez sur PlayComment activer le nouveau système d'entrée d' 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.
Vous pouvez supprimer le [email protected] . Veuillez noter cependant que le package d'Unity pour Newtonsoft JSON a une prise en charge IL2CPP. Si vous souhaitez le remplacer et utiliser IL2CPP, assurez-vous que l'implémentation JSON de votre choix prend également en charge IL2CPP.
Voici quelques échantillons de code rapides pour vous aider à démarrer. Pour des informations détaillées, veuillez consulter notre documentation
StreamChatClient - Le gestionnaire de chat principal qui vous permet de vous connecter avec le serveur de chat Stream, de créer des canaux, des canaux de requête, des utilisateurs et des membres en fonction des critères fournisStreamChannel - Channe les utilisateurs du groupe dans une conversation. Selon vos paramètres, les utilisateurs peuvent avoir besoin de rejoindre les canaux en tant que membres afin d'envoyer des messagesStreamUser - représenter un seul utilisateur au sein de votre applicationStreamChannelMember - Objet représentant un utilisateur qui est membre d'un canal spécifique. Cet objet contient la propriété member.User pour accéder à l'objet utilisateurStreamMessage - représente un seul message dans un canal Utilisateur le StreamChatClient.CreateDefaultClient(); Méthode d'usine pour créer une instance d' IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}La façon la plus simple de commencer est d'activer l'autorisation des développeurs et de se connecter avec les jetons AUTH générés côté client:
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 ) ; Chaque fonction qui attend la réponse du serveur que vous pouvez soit appeler à l'aide de la syntaxe Async / Await moderne C # ou ajouter le .AsCallback() et utiliser comme rappels classiques comme suit:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; La méthode .AsCallback() accepte deux délégués: Action<TResponse> onSuccess et l' Action<Exception> onFailure que vous pouvez utiliser pour réagir à la fois à la réussite et au cas de réponse d'erreur. Au lieu de cela, les rappels Lambda, vous pouvez également fournir des méthodes avec la même signature que dans l'exemple ci-dessous:
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 ) ;
} Nous conseillons fortement l'utilisation de la syntaxe async/await qui, comme vous le remarquerez dans les exemples suivants, rend le code beaucoup plus simple et plus facile à lire et à maintenir.
Une fois que vous êtes connecté, vous pouvez commencer à utiliser des canaux afin que les utilisateurs puissent envoyer des messages.
Il existe 2 façons de créer des canaux:
Pour les canaux prédéfinis auxquels les utilisateurs peuvent rejoindre. Ceci est idéal pour tous les canaux ou clans à usage général, clubs, groupes que les utilisateurs peuvent rejoindre ou quitter.
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;ou avec un rappel:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; Idéal pour les messages de groupe public ou privé, l'ordre des utilisateurs du groupe n'a pas d'importance, donc chaque fois que les utilisateurs sont connectés à l'aide de cette méthode, ils verront toujours leur historique de chat:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; Pour parcourir tous les canaux ou canaux filtrés par certains critères Utilisez 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 ) ;Le mécanisme de filtrage est très puissant et vous permet de combiner plusieurs règles. Vous pouvez consulter la liste complète des champs et opérateurs disponibles que vous pouvez utiliser pour l'interrogation de la chaîne ici.
// 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 )
} ; Les messages sont accessibles via la propriété channel.Messages qui contient la collecte des messages les plus récents. Parce qu'il peut y avoir des milliers de messages dans un historique de canal, la collection channel.Messages ne contient que les derniers messages. Vous pouvez charger des messages plus anciens en appelant le channel.LoadOlderMessagesAsync() qui chargera une partie supplémentaire de l'historique. Une approche commune consiste à appeler channel.LoadOlderMessagesAsync() chaque fois que les utilisateurs atteignent la fin de votre vue de défilement de messages, de cette façon, vous ne chargez des messages plus anciens que lorsque l'utilisateur souhaite réellement les afficher. Vous pouvez voir un exemple de cette approche dans MessagelistView.cs de l'exemple du projet
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" ,
} ) ;Les messages silencieux ne déclenchent pas d'événements pour les membres de la chaîne. Souvent utilisé pour les messages système
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" } }
}
} ) ;Efface uniquement le texte mais laisse d'autres données, réactions, sous-messages de threads, etc. Intact
await message . SoftDeleteAsync ( ) ; Supprime complètement un message et supprime toutes les données liées à ce message
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" ) ; Les objets de canal sont automatiquement mis à jour chaque fois que des modifications se produisent (nouveaux messages, réactions, etc.). Vous pouvez réagir à ces modifications en vous abonnant aux événements exposés à 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 représentant l'utilisateur sur l'appareil local 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 ) ;En savoir plus sur les paramètres et opérateurs de requête pris en charge
Selon la configuration de votre application, les utilisateurs peuvent avoir besoin de rejoindre les canaux en tant que membres afin d'envoyer des messages ou de voir les autres messages des utilisateurs
// 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 fournit tous les outils et fonctionnalités nécessaires pour gérer correctement une grande communauté.
Le signalement signifie que cet utilisateur ou message sera signalé à la modération du chat. Les administrateurs et les modérateurs de chat peuvent afficher les utilisateurs et les messages signalés dans le tableau de bord.
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; L'interdiction de l'IP aide à prévenir le cas où l'utilisateur crée un nouveau compte pour contourner l'interdiction.
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 ) ;L'utilisateur interdit de l'ombre ne sait pas qu'il est interdit. Cela est parfois utile car il faut plus de temps à un utilisateur pour réaliser qu'il est interdit.
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;Les exemples ci-dessus ne sont que quelques-uns de nombreux - consultez notre documentation complète pour plus d'informations et d'exemples
Allez-y et ouvrez le problème de Github avec votre demande et nous répondrons dès que possible.
Contactez notre soutien.
Nous avons récemment clôturé un tour de financement de la série B de 38 millions de dollars et nous continuons à croître activement. Nos API sont utilisées par plus d'un milliard d'utilisateurs finaux, et vous aurez la possibilité d'avoir un impact énorme sur le produit au sein d'une équipe des ingénieurs les plus forts du monde entier. Consultez nos ouvertures actuelles et postulez via le site Web de Stream.