diff --git a/com.unity.renderstreaming/CHANGELOG.md b/com.unity.renderstreaming/CHANGELOG.md index 0c8f713df..67678c977 100644 --- a/com.unity.renderstreaming/CHANGELOG.md +++ b/com.unity.renderstreaming/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to com.unity.renderstreaming package will be documented in t The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [3.1.0-exp.9] - 2024-12-13 + +### Changed +- deps: use com.unity.webrtc@3.0.0-pre.8 +- doc: improve the API documentation of VideoCodecInfo +- doc: improve the API documentation of AudioCodecInfo +- doc: improve the API documentation of VideoStreamSender +- doc: improve the API documentation of VideoStreamReceiver +- doc: improve the API documentation of InputSender +- doc: improve the API documentation of InputReceiver +- doc: improve the API documentation of AudioStreamSender +- doc: improve the API documentation of AudioStreamReceiver +- doc: improve the API documentation of SignalingManager + ## [3.1.0-exp.8] - 2023-11-30 ### Changed diff --git a/com.unity.renderstreaming/Runtime/Scripts/AudioCodecInfo.cs b/com.unity.renderstreaming/Runtime/Scripts/AudioCodecInfo.cs index 680b249e9..662d3b8ca 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/AudioCodecInfo.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/AudioCodecInfo.cs @@ -5,7 +5,7 @@ namespace Unity.RenderStreaming { /// - /// + /// Represents information about an audio codec, including its MIME type, SDP format parameters, channel count, and sample rate. /// [Serializable] public class AudioCodecInfo : IEquatable @@ -20,27 +20,27 @@ public class AudioCodecInfo : IEquatable private int m_SampleRate; /// - /// + /// Gets the name of the audio codec. /// public string name { get { return m_MimeType.GetCodecName(); } } /// - /// + /// Gets the MIME type of the audio codec. /// public string mimeType { get { return m_MimeType; } } /// - /// + /// Gets the number of audio channels. /// public int channelCount { get { return m_ChannelCount; } } /// - /// + /// Gets the sample rate of the audio. /// public int sampleRate { get { return m_SampleRate; } } /// - /// + /// Gets the SDP format parameters line. /// public string sdpFmtpLine { get { return m_SdpFmtpLine; } } @@ -50,10 +50,17 @@ static internal AudioCodecInfo Create(RTCRtpCodecCapability caps) } /// - /// + /// Determines whether the specified is equal to the current . /// - /// - /// + /// + /// + /// + /// + /// + /// The to compare with the current . + /// true if the specified is equal to the current ; otherwise, false. public bool Equals(AudioCodecInfo other) { if (other == null) @@ -65,30 +72,30 @@ public bool Equals(AudioCodecInfo other) } /// - /// + /// Determines whether the specified object is equal to the current . /// - /// - /// + /// The object to compare with the current . + /// true if the specified object is equal to the current ; otherwise, false. public override bool Equals(object obj) { return obj is AudioCodecInfo ? Equals((AudioCodecInfo)obj) : base.Equals(obj); } /// - /// + /// Returns a hash code for the . /// - /// + /// A hash code for the current . public override int GetHashCode() { return new { mimeType, sdpFmtpLine, channelCount, sampleRate }.GetHashCode(); } /// - /// + /// Determines whether two specified instances of are equal. /// - /// - /// - /// + /// The first to compare. + /// The second to compare. + /// true if the two instances are equal; otherwise, false. public static bool operator ==(AudioCodecInfo left, AudioCodecInfo right) { if (ReferenceEquals(left, null)) @@ -102,11 +109,11 @@ public override int GetHashCode() } /// - /// + /// Determines whether two specified instances of are not equal. /// - /// - /// - /// + /// The first to compare. + /// The second to compare. + /// true if the two instances are not equal; otherwise, false. public static bool operator !=(AudioCodecInfo left, AudioCodecInfo right) { return !(left == right); diff --git a/com.unity.renderstreaming/Runtime/Scripts/AudioStreamReceiver.cs b/com.unity.renderstreaming/Runtime/Scripts/AudioStreamReceiver.cs index be0f45c3d..2e80fd430 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/AudioStreamReceiver.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/AudioStreamReceiver.cs @@ -7,8 +7,9 @@ namespace Unity.RenderStreaming { /// - /// + /// AudioStreamReceiver is a component that receives audio streams and plays them through a specified AudioSource. /// + /// [AddComponentMenu("Render Streaming/Audio Stream Receiver")] public class AudioStreamReceiver : StreamReceiverBase { @@ -16,13 +17,13 @@ public class AudioStreamReceiver : StreamReceiverBase internal const string TargetAudioSourcePropertyName = nameof(m_TargetAudioSource); /// - /// + /// Delegate for handling updates to the received audio source. /// - /// + /// The updated AudioSource. public delegate void OnUpdateReceiveAudioSourceHandler(AudioSource source); /// - /// + /// Event triggered when the received audio source is updated. /// public OnUpdateReceiveAudioSourceHandler OnUpdateReceiveAudioSource; @@ -33,7 +34,7 @@ public class AudioStreamReceiver : StreamReceiverBase private AudioCodecInfo m_Codec; /// - /// + /// Gets the codec information for the audio stream. /// public AudioCodecInfo codec { @@ -41,7 +42,7 @@ public AudioCodecInfo codec } /// - /// + /// Gets or sets the target AudioSource where the received audio will be played. /// public AudioSource targetAudioSource { @@ -50,9 +51,15 @@ public AudioSource targetAudioSource } /// - /// + /// Gets the available audio codecs. /// - /// + /// + /// var codecs = AudioStreamReceiver.GetAvailableCodecs(); + /// foreach (var codec in codecs) + /// Debug.Log(codec.name); + /// + /// + /// A list of available codecs. static public IEnumerable GetAvailableCodecs() { var excludeCodecMimeType = new[] { "audio/CN", "audio/telephone-event" }; @@ -61,9 +68,18 @@ static public IEnumerable GetAvailableCodecs() } /// - /// + /// Sets the codec for the audio stream. /// - /// + /// + /// + /// x.mimeType.Contains("opus")); + /// audioStreamReceiver.SetCodec(codec); + /// ]]> + /// + /// + /// The codec information to set. + /// Thrown if the transceiver is streaming or the track has ended. public void SetCodec(AudioCodecInfo codec) { m_Codec = codec; diff --git a/com.unity.renderstreaming/Runtime/Scripts/AudioStreamSender.cs b/com.unity.renderstreaming/Runtime/Scripts/AudioStreamSender.cs index 918fef410..59882ab84 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/AudioStreamSender.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/AudioStreamSender.cs @@ -9,31 +9,33 @@ namespace Unity.RenderStreaming { /// - /// + /// Specifies the source of the audio stream. /// public enum AudioStreamSource { /// - /// + /// Use the AudioListener component as the audio source. /// AudioListener = 0, /// - /// + /// Use the AudioSource component as the audio source. /// AudioSource = 1, /// - /// + /// Use the microphone as the audio source. /// Microphone = 2, /// - /// + /// Use only the API to provide audio data. /// APIOnly = 3 } /// - /// Attach AudioListerner or AudioSource + /// Component for sending audio streams. /// + /// + /// [AddComponentMenu("Render Streaming/Audio Stream Sender")] public class AudioStreamSender : StreamSenderBase { @@ -80,7 +82,7 @@ public class AudioStreamSender : StreamSenderBase private int m_frequency = 48000; /// - /// + /// Gets or sets the source of the audio stream. /// public AudioStreamSource source { @@ -100,7 +102,7 @@ public AudioStreamSource source } /// - /// + /// Gets the codec used for the audio stream. /// public AudioCodecInfo codec { @@ -108,7 +110,7 @@ public AudioCodecInfo codec } /// - /// + /// Gets the minimum bitrate for the audio stream. /// public uint minBitrate { @@ -116,7 +118,7 @@ public uint minBitrate } /// - /// + /// Gets the maximum bitrate for the audio stream. /// public uint maxBitrate { @@ -124,7 +126,7 @@ public uint maxBitrate } /// - /// Play or not sending to remote audio in local. + /// Gets or sets whether to play the audio locally while sending it to the remote peer. /// public bool loopback { @@ -149,7 +151,7 @@ public bool loopback } /// - /// The index of Microphone.devices. + /// Gets or sets the index of the microphone device used as the audio source. /// public int sourceDeviceIndex { @@ -169,7 +171,7 @@ public int sourceDeviceIndex } /// - /// + /// Gets or sets the AudioSource component used as the audio source. /// public AudioSource audioSource { @@ -189,7 +191,7 @@ public AudioSource audioSource } /// - /// + /// Gets or sets the AudioListener component used as the audio source. /// public AudioListener audioListener { @@ -209,9 +211,15 @@ public AudioListener audioListener } /// - /// + /// Gets the available video codecs. /// - /// + /// + /// var codecs = VideoStreamSender.GetAvailableCodecs(); + /// foreach (var codec in codecs) + /// Debug.Log(codec.name); + /// + /// + /// A list of available codecs. static public IEnumerable GetAvailableCodecs() { var excludeCodecMimeType = new[] { "audio/CN", "audio/telephone-event" }; @@ -220,10 +228,16 @@ static public IEnumerable GetAvailableCodecs() } /// - /// + /// Sets the bitrate range for the audio stream. /// - /// - /// + /// + /// + /// audioStreamSender.SetBitrate(128, 256); + /// + /// + /// The minimum bitrate in kbps. Must be greater than zero. + /// The maximum bitrate in kbps. Must be greater than or equal to the minimum bitrate. + /// Thrown when the maximum bitrate is less than the minimum bitrate. public void SetBitrate(uint minBitrate, uint maxBitrate) { if (minBitrate > maxBitrate) @@ -239,9 +253,17 @@ public void SetBitrate(uint minBitrate, uint maxBitrate) } /// - /// + /// Sets the codec for the audio stream. /// - /// + /// + /// + /// x.mimeType.Contains("opus")); + /// audioStreamSender.SetCodec(codec); + /// ]]> + /// + /// + /// The codec information to set. public void SetCodec(AudioCodecInfo codec) { m_Codec = codec; @@ -300,7 +322,6 @@ internal override WaitForCreateTrack CreateTrack() return m_sourceImpl.CreateTrack(); } - AudioStreamSourceImpl CreateAudioStreamSource() { switch (m_Source) @@ -317,7 +338,6 @@ AudioStreamSourceImpl CreateAudioStreamSource() throw new InvalidOperationException(""); } - private protected override void OnEnable() { OnAudioConfigurationChanged(false); @@ -331,6 +351,28 @@ private protected override void OnDisable() base.OnDisable(); } + /// + /// Sets the audio data for the stream. + /// + /// + /// + /// (bufferSize, Allocator.Temp); + /// for (int i = 0; i < bufferSize; i++) + /// { + /// audioData[i] = Mathf.Sin(2 * Mathf.PI * frequency * i / sampleRate); + /// } + /// audioStreamSender.SetData(audioData.AsReadOnly(), 1); + /// audioData.Dispose(); + /// ]]> + /// + /// + /// The native array containing the audio data. + /// The number of audio channels. + /// Thrown when the source property is not set to AudioStreamSource.APIOnly. public void SetData(NativeArray.ReadOnly nativeArray, int channels) { if (m_Source != AudioStreamSource.APIOnly) diff --git a/com.unity.renderstreaming/Runtime/Scripts/InputReceiver.cs b/com.unity.renderstreaming/Runtime/Scripts/InputReceiver.cs index ea48ee529..a95d35957 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/InputReceiver.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/InputReceiver.cs @@ -24,12 +24,12 @@ public class InputReceiver : InputChannelReceiverBase internal const string DefaultActionMapPropertyName = nameof(m_DefaultActionMap); /// - /// + /// Event triggered when a device changes. /// public override event Action onDeviceChange; /// - /// + /// Gets or sets the input action asset associated with the player. /// public InputActionAsset actions { @@ -66,22 +66,22 @@ public InputActionAsset actions } /// - /// + /// Indicates whether the input is currently active. /// public bool inputIsActive => m_InputActive; /// - /// + /// Gets or sets the default action map. /// public InputUser user => m_InputUser; /// - /// + /// Gets or sets the action events associated with the player. /// public ReadOnlyArray devices => m_InputUser.pairedDevices; /// - /// + /// Gets or sets the current action map. /// public InputActionMap currentActionMap { @@ -95,7 +95,7 @@ public InputActionMap currentActionMap } /// - /// + /// Gets or sets the default action map. /// public string defaultActionMap { @@ -104,7 +104,7 @@ public string defaultActionMap } /// - /// + /// Gets or sets the action events associated with the player. /// public ReadOnlyArray actionEvents { @@ -121,9 +121,6 @@ public ReadOnlyArray actionEvents } } - /// - /// - /// protected virtual void OnEnable() { m_Enabled = true; @@ -135,9 +132,6 @@ protected virtual void OnEnable() ActivateInput(); } - /// - /// - /// protected virtual void OnDisable() { m_Enabled = false; @@ -149,8 +143,15 @@ protected virtual void OnDisable() } /// - /// + /// Activates input for the player. /// + /// + /// + /// + /// + /// public void ActivateInput() { m_InputActive = true; @@ -164,8 +165,15 @@ public void ActivateInput() } /// - /// + /// Deactivates input for the player. /// + /// + /// + /// + /// + /// public void DeactivateInput() { m_CurrentActionMap?.Disable(); @@ -174,9 +182,17 @@ public void DeactivateInput() } /// - /// + /// Switches the current action map to the one with the given name or ID. /// - /// + /// The name or ID of the action map to switch to. + /// + /// + /// + /// + /// + public void SwitchCurrentActionMap(string mapNameOrId) { // Must be enabled. @@ -205,17 +221,33 @@ public void SwitchCurrentActionMap(string mapNameOrId) } /// - /// + /// Performs pairing with the specified input device. /// - /// + /// + /// + /// (); + /// playerInput.PerformPairingWithDevice(device); + /// ]]> + /// + /// + /// The input device to pair with. public void PerformPairingWithDevice(InputDevice device) { m_InputUser = InputUser.PerformPairingWithDevice(device, m_InputUser); } /// - /// + /// Performs pairing with all local devices. /// + /// + /// + /// (); + /// playerInput.PerformPairingWithAllLocalDevices(); + /// ]]> + /// + /// public void PerformPairingWithAllLocalDevices() { foreach (var device in Inputs.devices.Where(_ => !_.remote)) @@ -225,9 +257,17 @@ public void PerformPairingWithAllLocalDevices() } /// - /// + /// Unpairs the input user with the given device. /// - /// + /// + /// + /// (); + /// playerInput.UnpairDevices(device); + /// ]]> + /// + /// + /// The device to unpair. public void UnpairDevices(InputDevice device) { if (!m_InputUser.valid) @@ -236,9 +276,23 @@ public void UnpairDevices(InputDevice device) } /// - /// + /// Sets the RTCDataChannel for the sender. /// - /// + /// + /// + /// (); + /// var channel = channels.FirstOrDefault(_ => !_.IsLocal && !_.IsConnected); + /// channel?.SetChannel(data); + /// } + /// ]]> + /// + /// + /// The connection ID. + /// The RTCDataChannel to set. public override void SetChannel(string connectionId, RTCDataChannel channel) { if (channel == null) @@ -257,28 +311,39 @@ public override void SetChannel(string connectionId, RTCDataChannel channel) } /// - /// + /// Calculates the input region based on the given texture size and region in world coordinates. /// - /// Texture Size. - /// Region of the texture in world coordinate system. + /// + /// + /// + /// + /// + /// The region of the texture in world coordinate system. + /// The size of the texture. public void CalculateInputRegion(Vector2Int size, Rect region) { receiver.CalculateInputRegion(new Rect(Vector2.zero, size), region); } /// - /// + /// Enables or disables input position correction. /// - /// + /// + /// + /// + /// + /// + /// True to enable input position correction, false to disable. public void SetEnableInputPositionCorrection(bool enabled) { receiver.EnableInputPositionCorrection = enabled; } - - /// - /// - /// protected virtual void OnDestroy() { Dispose(); diff --git a/com.unity.renderstreaming/Runtime/Scripts/InputSender.cs b/com.unity.renderstreaming/Runtime/Scripts/InputSender.cs index c2cdf6e64..5d1a49f29 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/InputSender.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/InputSender.cs @@ -6,8 +6,9 @@ namespace Unity.RenderStreaming { /// - /// + /// The InputSender component is responsible for sending input data over a data channel in a Unity Render Streaming context. /// + /// [AddComponentMenu("Render Streaming/Input Sender")] public class InputSender : DataChannelBase { @@ -16,9 +17,23 @@ public class InputSender : DataChannelBase private IDisposable suscriberDisposer; /// - /// + /// Sets the RTCDataChannel for the sender. /// - /// + /// + /// + /// (); + /// var channel = channels.FirstOrDefault(_ => !_.IsLocal && !_.IsConnected); + /// channel?.SetChannel(data); + /// } + /// ]]> + /// + /// + /// The connection ID. + /// The RTCDataChannel to set. public override void SetChannel(string connectionId, RTCDataChannel channel) { if (channel == null) @@ -37,19 +52,34 @@ public override void SetChannel(string connectionId, RTCDataChannel channel) } /// - /// + /// Calculates the input region based on the given texture size and region in world coordinates. /// - /// Texture Size. - /// Region of the texture in world coordinate system. + /// + /// + /// + /// + /// + /// The region of the texture in world coordinate system. + /// The size of the texture. public void CalculateInputResion(Rect region, Vector2Int size) { sender.CalculateInputRegion(region, new Rect(Vector2.zero, size)); } /// - /// + /// Enables or disables input position correction. /// - /// + /// + /// + /// + /// + /// + /// True to enable input position correction, false to disable. public void EnableInputPositionCorrection(bool enabled) { sender.EnableInputPositionCorrection = enabled; diff --git a/com.unity.renderstreaming/Runtime/Scripts/SignalingManager.cs b/com.unity.renderstreaming/Runtime/Scripts/SignalingManager.cs index b9f8a22a1..fec7a5a4a 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/SignalingManager.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/SignalingManager.cs @@ -13,6 +13,12 @@ namespace Unity.RenderStreaming { + /// + /// Manages the signaling process for Unity RenderStreaming. + /// + /// + /// + /// [AddComponentMenu("Render Streaming/Signaling Manager")] public sealed class SignalingManager : MonoBehaviour { @@ -37,13 +43,13 @@ public sealed class SignalingManager : MonoBehaviour private List handlers = new List(); /// - /// + /// Indicates whether the signaling process should automatically start when the Awake method is called. /// [SerializeField, Tooltip("Automatically started when called Awake method.")] public bool runOnAwake = true; /// - /// + /// Indicates whether to evaluate command line arguments if launching runtime on the command line. /// [SerializeField, Tooltip("Evaluate commandline arguments if launching runtime on the command line.")] public bool evaluateCommandlineArguments = true; @@ -55,7 +61,7 @@ public sealed class SignalingManager : MonoBehaviour private bool m_running; /// - /// + /// Gets a value indicating whether the signaling process is running. /// public bool Running => m_running; @@ -79,10 +85,20 @@ public bool useDefaultSettings } /// - /// + /// Sets the signaling settings. /// - /// - /// + /// + /// + /// var settings = new WebSocketSignalingSettings("ws://example.com", new[] + /// { + /// new IceServer (urls: new[] {"stun:stun.l.google.com:19302"}) + /// }); + /// signalingManager.SetSignalingSettings(settings); + /// + /// + /// The signaling settings. + /// Thrown when the signaling process has already started. + /// Thrown when the settings are null. public void SetSignalingSettings(SignalingSettings settings) { if (m_running) @@ -95,18 +111,33 @@ public void SetSignalingSettings(SignalingSettings settings) } /// - /// + /// Gets the signaling settings. /// - /// + /// + /// + /// var settings = signalingManager.GetSignalingSettings(); + /// if (settings is WebSocketSignalingSettings webSocketSettings) + /// { + /// Debug.Log($"WebSocket URL: {webSocketSettings.url}"); + /// } + /// + /// + /// The signaling settings. public SignalingSettings GetSignalingSettings() { return signalingSettings; } /// - /// + /// Adds a signaling handler. /// - /// + /// + /// + /// var handler = instance.GetComponent(); + /// signalingManager.AddSignalingHandler(handler); + /// + /// + /// The signaling handler to add. public void AddSignalingHandler(SignalingHandlerBase handlerBase) { if (handlers.Contains(handlerBase)) @@ -124,9 +155,15 @@ public void AddSignalingHandler(SignalingHandlerBase handlerBase) } /// - /// + /// Removes a signaling handler. /// - /// + /// + /// + /// var handler = instance.GetComponent(); + /// signalingManager.RemoveSignalingHandler(handler); + /// + /// + /// The signaling handler to remove. public void RemoveSignalingHandler(SignalingHandlerBase handlerBase) { handlers.Remove(handlerBase); @@ -140,10 +177,15 @@ public void RemoveSignalingHandler(SignalingHandlerBase handlerBase) } /// - /// + /// Runs the signaling process. /// - /// - /// + /// The signaling instance to use. If null, a new instance will be created. + /// The signaling handlers to use. If null, the existing handlers will be used. + /// + /// + /// signalingManager.Run(); + /// + /// public void Run( ISignaling signaling = null, SignalingHandlerBase[] handlers = null) @@ -152,12 +194,21 @@ public void Run( } /// - /// + /// Runs the signaling process with the specified RTC configuration. /// - /// - /// - /// - /// To use this method, Need to depend WebRTC package + /// + /// + /// var rtcConfig = new RTCConfiguration + /// { + /// iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } } + /// }; + /// signalingManager.Run(rtcConfig); + /// + /// + /// The RTC configuration. + /// The signaling instance to use. If null, a new instance will be created. + /// The signaling handlers to use. If null, the existing handlers will be used. + /// To use this method, the WebRTC package is required. public void Run( RTCConfiguration conf, ISignaling signaling = null, @@ -178,12 +229,6 @@ bool IsValidSignalingSettingsObject(SignalingSettingsObject asset) } #endif - /// - /// - /// - /// - /// - /// private void _Run( RTCConfiguration? conf = null, ISignaling signaling = null, @@ -266,8 +311,13 @@ internal static bool EvaluateCommandlineArguments(ref SignalingSettings settings } /// - /// + /// Stops the signaling process. /// + /// + /// + /// signalingManager.Stop(); + /// + /// public void Stop() { m_instance?.Dispose(); diff --git a/com.unity.renderstreaming/Runtime/Scripts/VideoCodecInfo.cs b/com.unity.renderstreaming/Runtime/Scripts/VideoCodecInfo.cs index ef07054dd..5f1d7cf9c 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/VideoCodecInfo.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/VideoCodecInfo.cs @@ -6,7 +6,7 @@ namespace Unity.RenderStreaming { /// - /// + /// Represents information about a video codec, including its MIME type, SDP format parameters. /// [Serializable] public class VideoCodecInfo : IEquatable @@ -21,30 +21,37 @@ public class VideoCodecInfo : IEquatable readonly Dictionary m_parameters = new Dictionary(); /// - /// + /// Gets the name of the video codec. /// public string name { get { return m_MimeType.GetCodecName(); } } /// - /// + /// Gets the MIME type of the video codec. /// public string mimeType { get { return m_MimeType; } } /// - /// + /// Gets the codec implementation name. /// public string codecImplementation { get { return parameters[KeyCodecImplementation]; } } /// - /// + /// Gets the SDP format parameters line. /// public string sdpFmtpLine { get { return m_SdpFmtpLine; } } /// - /// + /// Determines whether the specified is equal to the current . /// - /// - /// + /// + /// + /// + /// + /// + /// The to compare with the current . + /// True if the specified is equal to the current ; otherwise, false. public bool Equals(VideoCodecInfo other) { if (other == null) @@ -54,30 +61,31 @@ public bool Equals(VideoCodecInfo other) } /// - /// + /// Determines whether the specified object is equal to the current . /// - /// - /// + /// The object to compare with the current . + /// True if the specified object is equal to the current ; otherwise, false. public override bool Equals(object obj) { return obj is VideoCodecInfo ? Equals((VideoCodecInfo)obj) : base.Equals(obj); } /// - /// + /// Returns a hash code for the . + /// The hash code is based on the MIME type and SDP format parameters line properties. /// - /// + /// A hash code for the current . public override int GetHashCode() { return new { mimeType, sdpFmtpLine }.GetHashCode(); } /// - /// + /// Determines whether two specified instances of are equal. /// - /// - /// - /// + /// The first to compare. + /// The second to compare. + /// True if the two instances are equal; otherwise, false. public static bool operator ==(VideoCodecInfo left, VideoCodecInfo right) { if (ReferenceEquals(left, null)) @@ -91,11 +99,11 @@ public override int GetHashCode() } /// - /// + /// Determines whether two specified instances of are not equal. /// - /// - /// - /// + /// The first to compare. + /// The second to compare. + /// True if the two instances are not equal; otherwise, false. public static bool operator !=(VideoCodecInfo left, VideoCodecInfo right) { return !(left == right); @@ -158,37 +166,37 @@ internal VideoCodecInfo(RTCRtpCodecCapability caps) } /// - /// + /// Represents the profiles for the VP9 video codec. /// public enum VP9Profile { /// - /// + /// Profile 0. /// Profile0 = 0, /// - /// + /// Profile 1. /// Profile1 = 1, /// - /// + /// Profile 2. /// Profile2 = 2, /// - /// + /// Profile 3. /// Profile3 = 3, } /// - /// + /// Represents information about the VP9 video codec. /// public class VP9CodecInfo : VideoCodecInfo { const string KeyProfileId = "profile-id"; /// - /// + /// Gets the profile of the VP9 video codec. /// public VP9Profile? profile { @@ -208,7 +216,7 @@ internal VP9CodecInfo(RTCRtpCodecCapability caps) : base(caps) } /// - /// + /// Represents the profiles for the H264 video codec. /// public enum H264Profile { @@ -235,14 +243,14 @@ public enum H264Profile } /// - /// + /// Represents information about the H264 video codec. /// public class H264CodecInfo : VideoCodecInfo { const string KeyProfileLevelId = "profile-level-id"; /// - /// + /// Gets the profile of the H264 video codec. /// public H264Profile profile { @@ -250,7 +258,7 @@ public H264Profile profile } /// - /// + /// Gets the level of the H264 video codec. /// public int level { get { return Convert.ToInt32(parameters[KeyProfileLevelId], 16) & 0xFF; } } @@ -260,33 +268,33 @@ internal H264CodecInfo(RTCRtpCodecCapability caps) : base(caps) } /// - /// + /// Represents the profiles for the AV1 video codec. /// public enum AV1Profile { /// - /// + /// Profile 0. /// Profile0 = 0, /// - /// + /// Profile 1. /// Profile1 = 1, /// - /// + /// Profile 2. /// Profile2 = 2, } /// - /// + /// Represents information about the AV1 video codec. /// public class AV1CodecInfo : VideoCodecInfo { const string KeyProfile = "profile"; /// - /// + /// Gets the profile of the AV1 video codec. /// public AV1Profile profile { diff --git a/com.unity.renderstreaming/Runtime/Scripts/VideoStreamReceiver.cs b/com.unity.renderstreaming/Runtime/Scripts/VideoStreamReceiver.cs index 033756cfe..bb49efa1a 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/VideoStreamReceiver.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/VideoStreamReceiver.cs @@ -8,22 +8,22 @@ namespace Unity.RenderStreaming { /// - /// + /// Enum representing the video render mode. /// public enum VideoRenderMode { /// - /// + /// Render to a RenderTexture. /// RenderTexture, /// - /// + /// API only, no rendering. /// APIOnly, } /// - /// + /// Component for receiving video streams. /// [AddComponentMenu("Render Streaming/Video Stream Receiver")] public class VideoStreamReceiver : StreamReceiverBase @@ -33,13 +33,13 @@ public class VideoStreamReceiver : StreamReceiverBase internal const string TargetTexturePropertyName = nameof(m_TargetTexture); /// - /// + /// Delegate for updating the received texture. /// - /// + /// The received texture. public delegate void OnUpdateReceiveTextureHandler(Texture receiveTexture); /// - /// + /// Event triggered when the received texture is updated. /// public OnUpdateReceiveTextureHandler OnUpdateReceiveTexture; @@ -53,7 +53,7 @@ public class VideoStreamReceiver : StreamReceiverBase private RenderTexture m_TargetTexture; /// - /// + /// Gets the codec information for the video stream. /// public VideoCodecInfo codec { @@ -61,22 +61,22 @@ public VideoCodecInfo codec } /// - /// + /// The width of the received video stream. /// public int width => m_texture.width; /// - /// + /// The height of the received video stream. /// public int height => m_texture.height; /// - /// + /// The texture of the received video stream. /// public Texture texture => m_texture; /// - /// + /// The target RenderTexture. /// public RenderTexture targetTexture { @@ -90,9 +90,15 @@ public RenderTexture targetTexture /// - /// + /// Gets the available video codecs. /// - /// + /// + /// var codecs = VideoStreamSender.GetAvailableCodecs(); + /// foreach (var codec in codecs) + /// Debug.Log(codec.name); + /// + /// + /// A list of available codecs. public static IEnumerable GetAvailableCodecs() { string[] excludeCodecMimeType = { "video/red", "video/ulpfec", "video/rtx", "video/flexfec-03" }; @@ -101,9 +107,18 @@ public static IEnumerable GetAvailableCodecs() } /// - /// + /// Sets the codec for the video stream. /// - /// + /// + /// + /// x.mimeType.Contains("VP9")); + /// videoStreamReceiver.SetCodec(codec); + /// ]]> + /// + /// + /// The codec information to set. + /// Thrown if the transceiver is streaming or the track has ended. public void SetCodec(VideoCodecInfo codec) { m_Codec = codec; diff --git a/com.unity.renderstreaming/Runtime/Scripts/VideoStreamSender.cs b/com.unity.renderstreaming/Runtime/Scripts/VideoStreamSender.cs index e9c75320c..9237cdd76 100644 --- a/com.unity.renderstreaming/Runtime/Scripts/VideoStreamSender.cs +++ b/com.unity.renderstreaming/Runtime/Scripts/VideoStreamSender.cs @@ -86,29 +86,29 @@ public static RTCError SetBitrate(this RTCRtpSender sender, uint? minBitrate, ui } /// - /// + /// Specifies the source of the video stream. /// public enum VideoStreamSource { /// - /// + /// Use the camera as the video stream source. /// Camera = 0, /// - /// + /// Use the screen as the video stream source. /// Screen = 1, /// - /// + /// Use the web camera as the video stream source. /// WebCamera = 2, /// - /// + /// Use a texture as the video stream source. /// Texture = 3 } /// - /// + /// Component for sending video streams. /// [AddComponentMenu("Render Streaming/Video Stream Sender")] public class VideoStreamSender : StreamSenderBase @@ -171,7 +171,7 @@ public class VideoStreamSender : StreamSenderBase private VideoStreamSourceImpl m_sourceImpl = null; /// - /// + /// Gets or sets the source of the video stream. /// public VideoStreamSource source { @@ -191,7 +191,7 @@ public VideoStreamSource source } /// - /// + /// Gets or sets the camera used as the video stream source. /// public Camera sourceCamera { @@ -211,7 +211,7 @@ public Camera sourceCamera } /// - /// + /// Gets or sets the texture used as the video stream source. /// public Texture sourceTexture { @@ -251,7 +251,7 @@ public int sourceDeviceIndex } /// - /// + /// Gets the WebCamTexture used as the video stream source. /// public WebCamTexture sourceWebCamTexture { @@ -267,7 +267,7 @@ public WebCamTexture sourceWebCamTexture /// - /// + /// Gets the frame rate of the video stream. /// public float frameRate { @@ -275,7 +275,7 @@ public float frameRate } /// - /// + /// Gets the minimum bitrate of the video stream. /// public uint minBitrate { @@ -283,7 +283,7 @@ public uint minBitrate } /// - /// + /// Gets the maximum bitrate of the video stream. /// public uint maxBitrate { @@ -291,7 +291,7 @@ public uint maxBitrate } /// - /// + /// The scale factor by which to reduce the video resolution to conserve bandwidth. /// public float scaleResolutionDown { @@ -299,7 +299,7 @@ public float scaleResolutionDown } /// - /// + /// Gets or sets the width of the frame buffer used for streaming. /// public uint width { @@ -311,7 +311,7 @@ public uint width } /// - /// + /// Gets or sets the height of the frame buffer used for streaming. /// public uint height { @@ -323,7 +323,7 @@ public uint height } /// - /// + /// Gets the codec information for the video stream. /// public VideoCodecInfo codec { @@ -331,7 +331,7 @@ public VideoCodecInfo codec } /// - /// + /// Whether request permission to use any video input sources. /// public bool autoRequestUserAuthorization { @@ -340,9 +340,17 @@ public bool autoRequestUserAuthorization } /// - /// + /// Sets the codec for the video stream. /// - /// + /// + /// + /// x.mimeType.Contains("VP9")); + /// videoStreamSender.SetCodec(codec); + /// ]]> + /// + /// + /// The codec information to set. public void SetCodec(VideoCodecInfo codec) { if (isPlaying) @@ -364,9 +372,15 @@ public void SetCodec(VideoCodecInfo codec) } /// - /// + /// Gets the available video codecs. /// - /// + /// + /// var codecs = VideoStreamSender.GetAvailableCodecs(); + /// foreach (var codec in codecs) + /// Debug.Log(codec.name); + /// + /// + /// A list of available codecs. public static IEnumerable GetAvailableCodecs() { string[] excludeCodecMimeType = { "video/red", "video/ulpfec", "video/rtx", "video/flexfec-03" }; @@ -375,9 +389,15 @@ public static IEnumerable GetAvailableCodecs() } /// - /// + /// Sets the frame rate for the video stream. /// - /// + /// + /// + /// videoStreamSender.SetFrameRate(30.0f); + /// + /// + /// The new frame rate. Must be greater than zero. + /// Thrown when the frame rate is less than or equal to zero. public void SetFrameRate(float frameRate) { if (frameRate < 0) @@ -392,9 +412,16 @@ public void SetFrameRate(float frameRate) } /// - /// + /// Sets the bitrate range for the video stream. /// - /// + /// + /// + /// videoStreamSender.SetBitrate(1000, 2500); + /// + /// + /// The minimum bitrate in kbps. Must be greater than zero. + /// The maximum bitrate in kbps. Must be greater than or equal to the minimum bitrate. + /// Thrown when the maximum bitrate is less than the minimum bitrate. public void SetBitrate(uint minBitrate, uint maxBitrate) { if (minBitrate > maxBitrate) @@ -410,9 +437,15 @@ public void SetBitrate(uint minBitrate, uint maxBitrate) } /// - /// + /// Sets the scale factor by which to reduce the video resolution to conserve bandwidth. /// - /// The parameter must be greater than 1.0f. + /// + /// + /// videoStreamSender.SetScaleResolutionDown(2.0f); + /// + /// + /// The scale factor by which to reduce the resolution. Must be greater than 1.0f. + /// Thrown when the scale factor is less than or equal to 1.0f. public void SetScaleResolutionDown(float scaleFactor) { if (scaleFactor < 1.0f) @@ -429,9 +462,14 @@ public void SetScaleResolutionDown(float scaleFactor) } /// - /// + /// Sets the size of the frame buffer used for streaming. /// - /// + /// + /// + /// SetTextureSize(new Vector2Int(1920, 1080)); + /// + /// + /// The new size of the texture as a Vector2Int. public void SetTextureSize(Vector2Int size) { m_TextureSize = size; diff --git a/com.unity.renderstreaming/package.json b/com.unity.renderstreaming/package.json index 13a8be1e1..6c4a51828 100644 --- a/com.unity.renderstreaming/package.json +++ b/com.unity.renderstreaming/package.json @@ -1,11 +1,11 @@ { "name": "com.unity.renderstreaming", "displayName": "Unity Render Streaming", - "version": "3.1.0-exp.8", + "version": "3.1.0-exp.9", "unity": "2020.3", "description": "This is a package for using Unity Render Streaming technology.", "dependencies": { - "com.unity.webrtc": "3.0.0-pre.7", + "com.unity.webrtc": "3.0.0-pre.8", "com.unity.inputsystem": "1.5.1", "com.unity.ugui": "1.0.0", "com.unity.modules.screencapture": "1.0.0" diff --git a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt b/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt deleted file mode 100644 index 384180a92..000000000 --- a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt +++ /dev/null @@ -1,3 +0,0 @@ -This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/ - -Please visit their website to view the complete set of their emojis and review their licensing terms. \ No newline at end of file diff --git a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta b/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta deleted file mode 100644 index 0d30e6532..000000000 --- a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 381dcb09d5029d14897e55f98031fca5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.json b/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.json deleted file mode 100644 index 6c4e50bc8..000000000 --- a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.json +++ /dev/null @@ -1,156 +0,0 @@ -{"frames": [ - -{ - "filename": "1f60a.png", - "frame": {"x":0,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f60b.png", - "frame": {"x":128,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f60d.png", - "frame": {"x":256,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f60e.png", - "frame": {"x":384,"y":0,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f600.png", - "frame": {"x":0,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f601.png", - "frame": {"x":128,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f602.png", - "frame": {"x":256,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f603.png", - "frame": {"x":384,"y":128,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f604.png", - "frame": {"x":0,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f605.png", - "frame": {"x":128,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f606.png", - "frame": {"x":256,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f609.png", - "frame": {"x":384,"y":256,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f618.png", - "frame": {"x":0,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "1f923.png", - "frame": {"x":128,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "263a.png", - "frame": {"x":256,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}, -{ - "filename": "2639.png", - "frame": {"x":384,"y":384,"w":128,"h":128}, - "rotated": false, - "trimmed": false, - "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, - "sourceSize": {"w":128,"h":128}, - "pivot": {"x":0.5,"y":0.5} -}], -"meta": { - "app": "http://www.codeandweb.com/texturepacker", - "version": "1.0", - "image": "EmojiOne.png", - "format": "RGBA8888", - "size": {"w":512,"h":512}, - "scale": "1", - "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$" -} -} diff --git a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta b/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta deleted file mode 100644 index 762cf15c9..000000000 --- a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8f05276190cf498a8153f6cbe761d4e6 -timeCreated: 1480316860 -licenseType: Pro -TextScriptImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.png b/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.png deleted file mode 100644 index 4adb015b0..000000000 Binary files a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.png and /dev/null differ diff --git a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta b/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta deleted file mode 100644 index c9fa1a7df..000000000 --- a/com.unity.template.renderstreaming-hd/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta +++ /dev/null @@ -1,431 +0,0 @@ -fileFormatVersion: 2 -guid: dffef66376be4fa480fb02b19edbe903 -TextureImporter: - fileIDToRecycleName: - 21300000: EmojiOne_0 - 21300002: EmojiOne_1 - 21300004: EmojiOne_2 - 21300006: EmojiOne_3 - 21300008: EmojiOne_4 - 21300010: EmojiOne_6 - 21300012: EmojiOne_7 - 21300014: EmojiOne_8 - 21300016: EmojiOne_9 - 21300018: EmojiOne_10 - 21300020: EmojiOne_11 - 21300022: EmojiOne_12 - 21300024: EmojiOne_13 - 21300026: EmojiOne_5 - 21300028: EmojiOne_14 - externalObjects: {} - serializedVersion: 5 - mipmaps: - mipMapMode: 0 - enableMipMap: 1 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: -1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -1 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 2 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spritePixelsToUnits: 100 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 0 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - platformSettings: - - serializedVersion: 2 - buildTarget: DefaultTexturePlatform - maxTextureSize: 512 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - - serializedVersion: 2 - buildTarget: Standalone - maxTextureSize: 512 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - - serializedVersion: 2 - buildTarget: iPhone - maxTextureSize: 512 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - - serializedVersion: 2 - buildTarget: Android - maxTextureSize: 512 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - spriteSheet: - serializedVersion: 2 - sprites: - - serializedVersion: 2 - name: EmojiOne_0 - rect: - serializedVersion: 2 - x: 0 - y: 384 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 4bcc36da2108f2c4ba3de5c921d25c3c - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_1 - rect: - serializedVersion: 2 - x: 128 - y: 384 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: e9eea8093eaeaee4d901c4553f572c22 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_2 - rect: - serializedVersion: 2 - x: 256 - y: 384 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 49451da35411dcc42a3692e39b0fde70 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_3 - rect: - serializedVersion: 2 - x: 384 - y: 384 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: f65709664b924904790c850a50ca82bc - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_4 - rect: - serializedVersion: 2 - x: 0 - y: 256 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 5b92c568a5ec9ad4b9ed90e271f1c9a8 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_6 - rect: - serializedVersion: 2 - x: 256 - y: 256 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: b10f2b48b7281594bb8a24a6511a35af - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_7 - rect: - serializedVersion: 2 - x: 384 - y: 256 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 10a600f9329dc2246a897e89f4d283cd - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_8 - rect: - serializedVersion: 2 - x: 0 - y: 128 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 66cffa363b90ab14787d8a5b90cf4502 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_9 - rect: - serializedVersion: 2 - x: 128 - y: 128 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 55cf3d409c9b89349b1e1bdc1cc224ad - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_10 - rect: - serializedVersion: 2 - x: 256 - y: 128 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 2a9e58eaf96feef42bcefa1cf257193f - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_11 - rect: - serializedVersion: 2 - x: 384 - y: 128 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 2489120affc155840ae6a7be2e93ce19 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_12 - rect: - serializedVersion: 2 - x: 0 - y: 0 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: 412349a150598d14da4d7140df5c0286 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_13 - rect: - serializedVersion: 2 - x: 128 - y: 0 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0.5, y: 0.5} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: a937464b42bb3634782dea34c6becb6c - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_5 - rect: - serializedVersion: 2 - x: 256 - y: 0 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0, y: 0} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: b0f933b217682124dbfc5e6b89abe3d0 - vertices: [] - indices: - edges: [] - weights: [] - - serializedVersion: 2 - name: EmojiOne_14 - rect: - serializedVersion: 2 - x: 128 - y: 256 - width: 128 - height: 128 - alignment: 0 - pivot: {x: 0, y: 0} - border: {x: 0, y: 0, z: 0, w: 0} - outline: [] - physicsShape: [] - tessellationDetail: 0 - bones: [] - spriteID: f7235c763afe4434e8bb666750a41096 - vertices: [] - indices: - edges: [] - weights: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: 3e32d8f5477abfc43b19066e8ad5032e - vertices: [] - indices: - edges: [] - weights: [] - spritePackingTag: - userData: - assetBundleName: - assetBundleVariant: