M1: add networked rigged player avatar (run-around character)

- Import Hodaart Low Poly Character Collection 3 (humanoid-rigged, LFS)
- PlayerAvatar.cs: owner-authoritative CharacterController movement, animation
  derived from measured speed on every client (no NetworkAnimator needed)
- OwnerAuthNetworkTransform.cs: owner-authoritative NetworkTransform
- PlayerLocomotion.controller: Idle/Walk/Run 1D blend tree on Speed (reuses
  Hodaart clips)
- PlayerCharacter.prefab (Character 01 + CC + NetworkObject + owner NT +
  PlayerAvatar + Animator w/ humanoid avatar); registered as PlayerPrefab
- Verified in play: spawns, visible, Idle pose (rig animates), owner-auth

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
megaproxy 2026-07-12 18:43:39 +01:00
parent 5db61fdb57
commit 94951ec70a
141 changed files with 287727 additions and 1 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 4442cb9ffe33fa543a16da9d5d125712
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/Demo Scene.unity
uploadId: 946460

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9d1d0fb01f7ca514f85010ff82d6007c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,118 @@
using System.Collections;
using UnityEngine;
namespace LowPolyCharacterCollection3
{
public class CharacterSelectionController : MonoBehaviour
{
[SerializeField] private GameObject[] characters;
private int currentIndex = 0;
private Animator currentAnimator;
[SerializeField] private float switchDelay = 0.5f;
private bool isSwitching = false;
void Start()
{
ShowCharacter(currentIndex);
}
void ShowCharacter(int index)
{
for (int i = 0; i < characters.Length; i++)
{
characters[i].SetActive(i == index);
}
currentAnimator = characters[index].GetComponent<Animator>();
}
public void NextCharacter()
{
StartCoroutine(SwitchCharacterWithDelay(+1));
}
public void PreviousCharacter()
{
StartCoroutine(SwitchCharacterWithDelay(-1));
}
IEnumerator SwitchCharacterWithDelay(int direction)
{
if (isSwitching) yield break;
isSwitching = true;
PlayIdle();
yield return new WaitForSeconds(switchDelay);
currentIndex += direction;
if (currentIndex >= characters.Length) currentIndex = 0;
if (currentIndex < 0) currentIndex = characters.Length - 1;
ShowCharacter(currentIndex);
isSwitching = false;
}
// ====================== Animations ======================
public void PlayWalk()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetBool("Walking", true);
}
public void PlayRun()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetBool("Running", true);
}
public void PlayJump()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetTrigger("Jump");
}
public void PlayDance1()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetBool("Dance 1",true);
}
public void PlayDance2()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetBool("Dance 2", true);
}
public void PlayHappyWalk()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetBool("Happy Walk", true);
}
public void PlayGreeting()
{
if (currentAnimator == null) return;
PlayIdle();
currentAnimator.SetTrigger("Greeting");
}
public void PlayIdle()
{
if (currentAnimator == null) return;
currentAnimator.SetBool("Walking", false);
currentAnimator.SetBool("Running", false);
currentAnimator.SetBool("Dance 1", false);
currentAnimator.SetBool("Dance 2", false);
currentAnimator.SetBool("Happy Walk", false);
}
}
}

View file

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 4386b74c02bd9624e9f7f3e6ac485fa8
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/Scripts/CharacterSelectionController.cs
uploadId: 946460

View file

@ -0,0 +1,51 @@
using UnityEngine;
using UnityEngine.EventSystems;
namespace LowPolyCharacterCollection3
{
public class DragRotateController : MonoBehaviour,
IPointerDownHandler, IDragHandler, IPointerUpHandler
{
[SerializeField] private Transform targetToRotate;
[SerializeField] private float rotationSpeed = 0.3f;
[SerializeField] private float smoothSpeed = 10f;
private float targetY;
private float currentY;
private float lastPointerX;
private bool isDragging;
void Start()
{
currentY = targetY = targetToRotate.eulerAngles.y;
}
void Update()
{
currentY = Mathf.Lerp(currentY, targetY, Time.deltaTime * smoothSpeed);
targetToRotate.rotation = Quaternion.Euler(0f, currentY, 0f);
}
public void OnPointerDown(PointerEventData eventData)
{
isDragging = true;
lastPointerX = eventData.position.x;
}
public void OnDrag(PointerEventData eventData)
{
if (!isDragging) return;
float deltaX = eventData.position.x - lastPointerX;
lastPointerX = eventData.position.x;
targetY -= deltaX * rotationSpeed;
}
public void OnPointerUp(PointerEventData eventData)
{
isDragging = false;
}
}
}

View file

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 0a1d299c242c80049827da9acd6d0722
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/Scripts/DragRotateController.cs
uploadId: 946460

View file

@ -0,0 +1,28 @@
using UnityEngine;
using UnityEngine.EventSystems;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem.UI;
#endif
namespace LowPolyCharacterCollection3
{
[DisallowMultipleComponent]
public class EventSystemEnsurer : MonoBehaviour
{
private void Awake()
{
if (FindObjectOfType<EventSystem>() == null)
{
var go = new GameObject("EventSystem");
go.AddComponent<EventSystem>();
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
go.AddComponent<InputSystemUIInputModule>();
Debug.Log("[EventSystemEnsurer] No EventSystem found — created one with InputSystemUIInputModule.");
#else
go.AddComponent<StandaloneInputModule>();
Debug.Log("[EventSystemEnsurer] No EventSystem found — created one with StandaloneInputModule.");
#endif
}
}
}
}

View file

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 7cda49a436f661a4fb324c56751db957
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/Scripts/EventSystemEnsurer.cs
uploadId: 946460

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 061e30cd0c88f534b8ed072472abd1de
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View file

@ -0,0 +1,125 @@
fileFormatVersion: 2
guid: c47d7d87e559230418f51ca763f6af0e
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 2
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/UI/Direction
Icon.png
uploadId: 946460

Binary file not shown.

View file

@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: badb41ab260fdca4696f0a3a31fb43c0
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 11
mipmaps:
mipMapMode: 0
enableMipMap: 0
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMasterTextureLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 64
resizeAlgorithm: 1
textureFormat: 4
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
spritePackingTag:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/UI/Next Sign.png
uploadId: 946460

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3a099bad81ebe10458e6a606dd8affbe
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,188 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-7893295128165547882
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3}
m_Name: Bloom
m_EditorClassIdentifier:
active: 0
skipIterations:
m_OverrideState: 1
m_Value: 0
threshold:
m_OverrideState: 1
m_Value: 1.2
intensity:
m_OverrideState: 1
m_Value: 1.9
scatter:
m_OverrideState: 1
m_Value: 0.5
clamp:
m_OverrideState: 0
m_Value: 65472
tint:
m_OverrideState: 0
m_Value: {r: 1, g: 1, b: 1, a: 1}
highQualityFiltering:
m_OverrideState: 1
m_Value: 1
downscale:
m_OverrideState: 0
m_Value: 0
maxIterations:
m_OverrideState: 0
m_Value: 6
dirtTexture:
m_OverrideState: 0
m_Value: {fileID: 0}
dimension: 1
dirtIntensity:
m_OverrideState: 0
m_Value: 0
--- !u!114 &-3357603926938260329
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3}
m_Name: Vignette
m_EditorClassIdentifier:
active: 1
color:
m_OverrideState: 0
m_Value: {r: 0, g: 0, b: 0, a: 1}
center:
m_OverrideState: 0
m_Value: {x: 0.5, y: 0.5}
intensity:
m_OverrideState: 1
m_Value: 0.415
smoothness:
m_OverrideState: 0
m_Value: 0.2
rounded:
m_OverrideState: 0
m_Value: 0
--- !u!114 &-1054047400808456816
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 66f335fb1ffd8684294ad653bf1c7564, type: 3}
m_Name: ColorAdjustments
m_EditorClassIdentifier:
active: 1
postExposure:
m_OverrideState: 1
m_Value: -0.08
contrast:
m_OverrideState: 1
m_Value: 18
colorFilter:
m_OverrideState: 0
m_Value: {r: 1, g: 1, b: 1, a: 1}
hueShift:
m_OverrideState: 0
m_Value: 0
saturation:
m_OverrideState: 0
m_Value: 0
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3}
m_Name: Global Volume
m_EditorClassIdentifier:
components:
- {fileID: 849379129802519247}
- {fileID: -7893295128165547882}
- {fileID: 7391319092446245454}
- {fileID: -3357603926938260329}
- {fileID: -1054047400808456816}
--- !u!114 &849379129802519247
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3}
m_Name: Tonemapping
m_EditorClassIdentifier:
active: 1
mode:
m_OverrideState: 1
m_Value: 1
neutralHDRRangeReductionMode:
m_OverrideState: 0
m_Value: 2
acesPreset:
m_OverrideState: 0
m_Value: 3
hueShiftAmount:
m_OverrideState: 0
m_Value: 0
detectPaperWhite:
m_OverrideState: 1
m_Value: 0
paperWhite:
m_OverrideState: 1
m_Value: 234
detectBrightnessLimits:
m_OverrideState: 1
m_Value: 1
minNits:
m_OverrideState: 1
m_Value: 0.005
maxNits:
m_OverrideState: 1
m_Value: 647
--- !u!114 &7391319092446245454
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3}
m_Name: MotionBlur
m_EditorClassIdentifier:
active: 0
mode:
m_OverrideState: 0
m_Value: 0
quality:
m_OverrideState: 1
m_Value: 2
intensity:
m_OverrideState: 1
m_Value: 0.6
clamp:
m_OverrideState: 0
m_Value: 0.05

View file

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: fbc7423e3d0ac64429a64e6d6dcf97a2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 388758
packageName: Low Poly Character Collection 3
packageVersion: 1.1
assetPath: Assets/Hodaart/HodaartLowPolyCharacterCollection3/Scene/Volume/Global
Volume.asset
uploadId: 946460