Open Beta

Post about the current Open Beta. Post logs to Gist/Pastebin! One item per post!
Non-constructive and off-topic posts will be moved or deleted.
[SDK 3.8.2-beta] Please provide changelog with technical words when it's hard to describe with normal words.
Please provide changelog with technical words when it's hard to describe with normal words. In SDK 3.8.2-beta.1, there's one fix described as "Added a validation error that prevents a humanoid avatar from being uploaded if it has a nested armature." and Nested Armature is described as "the root of the armature is not a direct child of the GameObject containing the avatar's animator." However, this is misrepresented or partially incorrect depending on the interpretation of "armature". There's no "armature" in the unity world (as far as I know and searched) but a few similar or related concepts. When I see the description, I came up with several hierarchy structures like: 1) Having independent FBX model with bone skinning inside an avatar. (If made with blender, typically contains GameObject named "Armature") 2) Having same FBX model as avatar root with removing no objects from root model hierarchy. (If the avatar is made with blender, typically contains GameObject named "Armature") 3) Moving the bone hierarchy (if the avatar is made with blender, typically contains GameObject named "Armature") to the child of new GameObject in the avatar. And I tested them and only last one is detected as "Nested Armature" This should means the error is shown if the avatar's root's Animator component's avatarRoot is not same as avatar's root. However, the description of the changelog, it's hard to know 1 and 2 are not the case. Therefore, could you add the technical description when it's hard to describe without them in addition to current description, for advanced avatar developers.
2
·

available in future release

[1431]Udon that are inactive when the world is loaded are not synchronized when they become active
Udons that are inactive at the time of world loading will not be synchronized when they become active I first looked at the state immediately after Join. build the world by deactivating the Udon with one int type Udonsync variable the owner (playerID = 1) activates the synchronization object and counts the variable +1 nothing happens under non-owner player2 (playerID = 2) player2 activates the synchronization object and then the owner sets the count of the variable to 2. the value is synchronized for the first time to the synchronization object of player 2 and the count is set to 2. Then we examined the state of the object once it was activated. the synchronization object of player 2 is deactivated. the owner sets the variable count +1 twice. nothing happens under player 2. when player 2 activates the synchronization object, the synchronization events during the period of inactivity are executed consecutively and the count goes to 3 and then to 4. Finally, the state of the later-joiner is examined. In player 3's client, nothing happens immediately after Join because the Udon object is inactive. nothing happens when player 3 activates the object. when the owner sets the count of a variable to 5, the value of 5 is suddenly synced to player 3. If the Udon is active at the time of loading the world, the later-joiner will also be synchronized with the latest values immediately after the join. The owner does not need to do anything at this time. Translated with www.DeepL.com/Translator (free version) Test code: using System; using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; using TMPro; using VRC.Udon.Common; public class LaterJoinerTest : UdonSharpBehaviour { [SerializeField] TextMeshProUGUI log; [UdonSynced, FieldChangeCallback(nameof(TestValue))] int _testValue = 0; public int TestValue { get => _testValue; set { log.text += DateTime.Now.ToLongTimeString() + " OnValueChanged: new value = " + value.ToString() + ", old value = " + _testValue.ToString() + "\n"; _testValue = value; } } void Start() { log.text += DateTime.Now.ToLongTimeString() + " Start: playerID = " + Networking.LocalPlayer.playerId.ToString() + " value = " + TestValue.ToString() + "\n"; } private void OnEnable() { log.text += DateTime.Now.ToLongTimeString() + " OnEnable: value = " + TestValue.ToString() + "\n"; } private void OnDisable() { log.text += DateTime.Now.ToLongTimeString() + " OnDisable: value = " + TestValue.ToString() + "\n"; } public override void OnPreSerialization() { log.text += DateTime.Now.ToLongTimeString() + " OnPreSerializaton: value = " + TestValue.ToString() + "\n"; } public override void OnPostSerialization(SerializationResult result) { log.text += DateTime.Now.ToLongTimeString() + " OnPostSerializaton: value = " + TestValue.ToString() + "\n"; } public override void OnDeserialization() { log.text += DateTime.Now.ToLongTimeString() + " OnDeserializaton: value = " + TestValue.ToString() + "\n"; } public override void OnOwnershipTransferred(VRCPlayerApi player) { log.text += DateTime.Now.ToLongTimeString() + " OnOwnershipTransferred: playerID = " + player.playerId.ToString() + " value = " + TestValue.ToString() + "\n"; } public override void OnPlayerJoined(VRCPlayerApi player) { log.text += DateTime.Now.ToLongTimeString() + " OnPlayerJoined: playerID = " + player.playerId.ToString() + " value = " + TestValue.ToString() + "\n"; } public override void Interact() { if (!Networking.IsOwner(this.gameObject)) { Networking.SetOwner(Networking.LocalPlayer, this.gameObject); } TestValue++; RequestSerialization(); log.text += DateTime.Now.ToLongTimeString() + " Interact & RequestSerialization: value = " + TestValue.ToString() + "\n"; } }
9
·

available in future release

Load More