
El SDK de Unity oficial para el chat de transmisión.
Sitio web | Tutorial | Documentación SDK | Regístrese para la tecla API

El SDK de Stream Chat es el SDK de Unity oficial para el chat de transmisión, un servicio para construir chat y mensajes de mensajería y aplicaciones.
IL2CPP es compatible
WebGL es compatible
La transmisión es gratuita para la mayoría de los proyectos laterales y de pasatiempos. Puede usar Stream Chat de forma gratuita con menos de cinco miembros del equipo y no más de $ 10,000 en ingresos mensuales. Visite nuestro sitio web y solicite la cuenta de los fabricantes.
.unitypackageConsulte nuestro tutorial sobre cómo configurar su proyecto y realizar operaciones básicas.
En la carpeta StreamChat/SampleProject encontrará un ejemplo de chat completamente en funcionamiento con:

Creado con el sistema UGUI UGI de Unity y admite tanto Legacy como el sistema de entrada del nuevo Unity.
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene y presione el juego¿Cómo habilitar el nuevo sistema de entrada de 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.
Puede eliminar el [email protected] Directorio. Sin embargo, tenga en cuenta que el paquete de Unity para Newtonsoft JSON tiene soporte IL2CPP. Si desea reemplazarlo y aún usar IL2CPP, asegúrese de que la implementación JSON de su elección también admita IL2CPP.
Aquí hay algunas muestras de código rápido para comenzar. Para obtener información detallada, consulte nuestra documentación
StreamChatClient : el principal administrador de chat que le permite conectarse con el servidor de chat de transmisión, crear canales, canales de consulta, usuarios y miembros en función de los criterios proporcionadosStreamChannel : los usuarios del grupo de canales en una conversación. Dependiendo de su configuración, los usuarios pueden necesitar unir canales como miembros para enviar mensajesStreamUser : represente a un solo usuario dentro de su aplicaciónStreamChannelMember : objeto que representa a un usuario que es miembro de un canal específico. Este objeto contiene member.User de la propiedad. User para acceder al objeto de usuarioStreamMessage : representa un solo mensaje dentro de un canal Usuario el StreamChatClient.CreateDefaultClient(); Método de fábrica para crear una instancia de IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}La forma más fácil de comenzar es habilitar la autorización del desarrollador y conectarse con tokens de autenticación generados por el lado del cliente:
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 ) ; Cada función que espera la respuesta del servidor que puede llamar utilizando la sintaxis de Async/espera de C# o agregar el .AsCallback() y usar como devoluciones de llamada clásicas de la siguiente manera:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; El método .AsCallback() acepta dos delegados: Action<TResponse> onSuccess y la Action<Exception> onFailure que puede usar para reaccionar ante el caso de respuesta exitosa y de error. En su lugar, las devoluciones de llamada Lambda también pueden proporcionar métodos con la misma firma que en el ejemplo a continuación:
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 ) ;
} Aconsejamos firmemente usar la sintaxis async/await que, como notará en los siguientes ejemplos, hace que el código sea mucho más simple y fácil de leer y mantener.
Una vez que esté conectado, puede comenzar a usar canales para que los usuarios puedan enviar mensajes.
Hay 2 formas de crear canales:
Para canales predefinidos a los que los usuarios pueden unirse. Esto es ideal para cualquier canal o clanes de propósito general, clubes, grupos que los usuarios puedan unirse o dejar.
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;o con una devolución de llamada:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; Ideal para mensajes de grupo público o privado, el orden de los usuarios en el grupo no importa, por lo que cada vez que los usuarios estén conectados utilizando este método siempre verán su historial de chat:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; Para explorar todos los canales o canales filtrados por algunos criterios, use 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 ) ;El mecanismo de filtrado es muy poderoso y le permite combinar múltiples reglas. Puede consultar la lista completa de campos y operadores disponibles que puede usar para consultar el canal aquí.
// 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 )
} ; Se puede acceder a los mensajes a través de la propiedad channel.Messages que contiene la recopilación de los mensajes más recientes. Debido a que puede haber miles de mensajes en un historial de canales, la colección channel.Messages contiene solo los últimos mensajes. Puede cargar mensajes más antiguos llamando al channel.LoadOlderMessagesAsync() que cargará una parte adicional del historial. Un enfoque común es llamar channel.LoadOlderMessagesAsync() cada vez que los usuarios llegan al final de sus mensajes Vista de desplazamiento, de esta manera solo carga mensajes más antiguos cuando el usuario realmente quiere verlos. Puede ver un ejemplo de este enfoque en MessageListView.cs del proyecto de muestra.
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" ,
} ) ;Los mensajes silenciosos no activan eventos para los miembros del canal. A menudo utilizado para mensajes del sistema
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" } }
}
} ) ;Solo borra el texto pero deja otros datos relacionados, reacciones, subconsagos de subprocesos, etc.
await message . SoftDeleteAsync ( ) ; Elimina un mensaje por completo y elimina todos los datos relacionados con este mensaje.
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" ) ; Los objetos del canal se están actualizando automáticamente cada vez que ocurre cualquier cambio (nuevos mensajes, reacciones, etc.). Puede reaccionar a estos cambios suscribiéndose a eventos expuestos 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 que representa al usuario en el dispositivo 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 ) ;Lea más sobre parámetros y operadores de consultas compatibles
Dependiendo de la configuración de su aplicación, los usuarios pueden necesitar unir canales como miembros para enviar mensajes o ver mensajes de otros usuarios
// 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 proporciona todas las herramientas y características necesarias para administrar adecuadamente una gran comunidad.
Marcar significa que este usuario o mensaje se informará a la moderación de chat. Los administradores de chat y los moderadores pueden ver usuarios y mensajes informados en el tablero.
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 ayuda a evitar el caso donde el usuario crea una nueva cuenta para evitar la prohibición.
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 ) ;El usuario prohibido de Shadow no sabe que está siendo prohibido. Esto a veces es útil porque un usuario lleva tiempo adicional darse cuenta de que está prohibido.
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;Los ejemplos anteriores son solo unos pocos de muchos: consulte nuestra documentación completa para obtener más información y ejemplos
Continúe y abra el problema de GitHub con su solicitud y responderemos lo antes posible.
Comuníquese con nuestro apoyo.
Recientemente cerramos una ronda de financiación Serie B de $ 38 millones y seguimos creciendo activamente. Nuestras API son utilizadas por más de mil millones de usuarios finales, y tendrá la oportunidad de tener un gran impacto en el producto dentro de un equipo de los ingenieros más fuertes de todo el mundo. Consulte nuestras aperturas actuales y aplique a través del sitio web de Stream.