Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
0ad1fb0
setting correct default
SamuelBellomo Jul 5, 2021
24231cc
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Jul 12, 2021
9682498
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Jul 19, 2021
bc4d373
adding test benchmark for interpolation
SamuelBellomo Jul 20, 2021
3956a5d
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Jul 22, 2021
03262b3
#
SamuelBellomo Jul 23, 2021
c81f65a
#
SamuelBellomo Jul 28, 2021
4a4aa7b
#
SamuelBellomo Jul 29, 2021
5fc7b50
#
SamuelBellomo Aug 5, 2021
bb7dc83
#
SamuelBellomo Aug 5, 2021
db9688c
#
SamuelBellomo Aug 6, 2021
e7bbd12
#
SamuelBellomo Aug 10, 2021
b776957
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Aug 10, 2021
7b93e90
fixes for latest develop merge
SamuelBellomo Aug 11, 2021
3f937b5
#
SamuelBellomo Aug 11, 2021
b927f2c
cleanup
SamuelBellomo Aug 11, 2021
4a86539
renames
SamuelBellomo Aug 11, 2021
2cdbb1b
#
SamuelBellomo Aug 11, 2021
07c3d07
#
SamuelBellomo Aug 11, 2021
f6290e0
cleanup
SamuelBellomo Aug 13, 2021
c492349
#
SamuelBellomo Aug 13, 2021
6b6c5ca
#
SamuelBellomo Aug 13, 2021
890420e
#
SamuelBellomo Aug 13, 2021
a2b885f
adding interface for testing
SamuelBellomo Aug 14, 2021
d5936cc
smooth
SamuelBellomo Aug 14, 2021
3817962
Adding basis for tests
SamuelBellomo Aug 17, 2021
7ca5ced
#
SamuelBellomo Aug 17, 2021
e9ee9fd
#
SamuelBellomo Aug 17, 2021
c3cc8b9
#
SamuelBellomo Aug 17, 2021
e2b85c1
cleanup
SamuelBellomo Aug 17, 2021
9fb4e30
#
SamuelBellomo Aug 17, 2021
796ab67
#
SamuelBellomo Aug 17, 2021
ebdc1fd
#
SamuelBellomo Aug 17, 2021
2efc972
fix, server can have 0 buffer
SamuelBellomo Aug 20, 2021
ce03d58
test fixes
SamuelBellomo Aug 23, 2021
ad5d9ac
moving things to right place for future merge
SamuelBellomo Aug 23, 2021
3c1543b
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Aug 23, 2021
43ef524
moving tests too
SamuelBellomo Aug 23, 2021
f3d14f9
fix
SamuelBellomo Aug 23, 2021
716aad7
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Aug 23, 2021
bac5c85
merge branch 'develop' into 'sam/feature/interpolation-for-network-tr…
0xFA11 Aug 24, 2021
496fa82
some fixes
SamuelBellomo Aug 26, 2021
3b8a47e
Merge branch 'sam/feature/interpolation-for-network-transform' of git…
SamuelBellomo Aug 26, 2021
522558f
#
SamuelBellomo Aug 26, 2021
2f57fa9
#
SamuelBellomo Aug 26, 2021
b6ac562
smooth now
SamuelBellomo Sep 1, 2021
669b878
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Sep 1, 2021
54ee62e
fixes after merge
SamuelBellomo Sep 1, 2021
35606d7
#
SamuelBellomo Sep 2, 2021
3d56986
#
SamuelBellomo Sep 3, 2021
9374e4b
#
SamuelBellomo Sep 3, 2021
6c9b905
#
SamuelBellomo Sep 3, 2021
dcf36fc
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Sep 3, 2021
ae56748
#
SamuelBellomo Sep 3, 2021
544de80
Merge branch 'sam/feature/interpolation-for-network-transform' of git…
SamuelBellomo Sep 3, 2021
83998c7
Update com.unity.netcode.gameobjects/Prototyping/Interpolator/Buffere…
SamuelBellomo Sep 7, 2021
68ae5be
Update com.unity.netcode.gameobjects/Prototyping/Interpolator/Buffere…
SamuelBellomo Sep 7, 2021
9432c94
Update com.unity.netcode.gameobjects/Prototyping/Interpolator/Buffere…
SamuelBellomo Sep 7, 2021
1ebd1e5
Update com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterp…
SamuelBellomo Sep 7, 2021
5b1761b
code review feedback
SamuelBellomo Sep 7, 2021
1fb7bbf
Merge branch 'sam/feature/interpolation-for-network-transform' of git…
SamuelBellomo Sep 8, 2021
35815a3
cleanup, removing IInterpolator interface, removing other interpolato…
SamuelBellomo Sep 8, 2021
5d4470a
adding some comments
SamuelBellomo Sep 8, 2021
0747544
comment cleanup
SamuelBellomo Sep 9, 2021
b0cc994
after investigation, UseFixedUpdate isn't needed anymore with latest …
SamuelBellomo Sep 9, 2021
41aeef0
Fix axis sync issue.
SamuelBellomo Sep 10, 2021
d92cc1e
reverting back hasXX changes, we still need isDirty checks since hasX…
SamuelBellomo Sep 10, 2021
33751fe
using "SyncXX" instead of "HasXX". HasXX is never reset to false and …
SamuelBellomo Sep 10, 2021
93e8be7
fixing issue where we needed to do a first movement to get over netwo…
SamuelBellomo Sep 10, 2021
f207820
updating zoosam with latest changes
SamuelBellomo Sep 13, 2021
ee5b308
updating zoosam with latest changes
SamuelBellomo Sep 13, 2021
81fb86d
Merge branch 'sam/feature/interpolation-for-network-transform' of git…
SamuelBellomo Sep 13, 2021
0260b4b
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Sep 13, 2021
7dfecfd
fixing bad ref
SamuelBellomo Sep 13, 2021
4fb11ac
work in progress for client network transform, still some issues with…
SamuelBellomo Sep 13, 2021
3167e52
restricting access to buffered interpolator
SamuelBellomo Sep 13, 2021
8845a59
adding jira to todo
SamuelBellomo Sep 13, 2021
84d2beb
fix compile errors, trying to not have too much public APIs
SamuelBellomo Sep 13, 2021
3883bfb
removing commented lines
SamuelBellomo Sep 13, 2021
92b9a55
removing useless lines
SamuelBellomo Sep 13, 2021
ae2bc66
client auth works without interpolation, on to interpolation now
SamuelBellomo Sep 13, 2021
0271bce
closing down public api
SamuelBellomo Sep 13, 2021
bdecea9
adding missing script
SamuelBellomo Sep 14, 2021
5ccc78b
fixed init issue, now can switch owner at runtime with no issues
SamuelBellomo Sep 14, 2021
2e3f566
fixing default scene for builds
SamuelBellomo Sep 14, 2021
79d892a
Merge branch 'sam/feature/interpolation-for-network-transform' into s…
SamuelBellomo Sep 14, 2021
67689eb
adding missing meta files
SamuelBellomo Sep 14, 2021
23e6291
Merge branch 'sam/feature/interpolation-for-network-transform' into s…
SamuelBellomo Sep 14, 2021
03c87f3
Removing already deleted SyncTransform from Player.
SamuelBellomo Sep 14, 2021
2c4e6d1
reverting changes to samplescene, it was already in ZooSam
SamuelBellomo Sep 14, 2021
ebcbfa5
Merge branch 'sam/feature/interpolation-for-network-transform' into s…
SamuelBellomo Sep 14, 2021
2f6fa0b
scale error fixed, wasn't used interpolation for some reason...
SamuelBellomo Sep 14, 2021
c3fc31b
fix for warning to triggering
SamuelBellomo Sep 14, 2021
62f25dd
cleanup
SamuelBellomo Sep 14, 2021
474ca80
restricting protected API, now more encapsulated
SamuelBellomo Sep 14, 2021
5863918
Adding doc on CanWriteToTransform
SamuelBellomo Sep 15, 2021
e65ccbf
ClientNetworkTransform works with now limited API
SamuelBellomo Sep 16, 2021
707e1b4
cleanup comments
SamuelBellomo Sep 16, 2021
a2f04c7
removing useless method
SamuelBellomo Sep 16, 2021
b77980f
removing useless todo
SamuelBellomo Sep 16, 2021
6846e73
reverting back changes to NT tests
SamuelBellomo Sep 16, 2021
272a6db
restricting API
SamuelBellomo Sep 16, 2021
6978ee3
restricting API even more
SamuelBellomo Sep 16, 2021
3add037
caching transform
SamuelBellomo Sep 16, 2021
353c12c
adding doc
SamuelBellomo Sep 16, 2021
976002a
bumping exec order
SamuelBellomo Sep 16, 2021
f5e27b9
restricting public api
SamuelBellomo Sep 16, 2021
8545ea9
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Sep 16, 2021
9e22bfa
removing not submitted LiteNetLib from ZooSam
SamuelBellomo Sep 16, 2021
fd83c0a
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
SamuelBellomo Sep 16, 2021
96eef69
fixing formatting issue
SamuelBellomo Sep 16, 2021
5258c9b
more formatting
SamuelBellomo Sep 16, 2021
39ec721
fixing line issue
SamuelBellomo Sep 16, 2021
722361a
Merge branch 'sam/feature/interpolation-for-network-transform' into s…
SamuelBellomo Sep 16, 2021
d79aa53
format issue
SamuelBellomo Sep 16, 2021
3d69f23
format fix
SamuelBellomo Sep 16, 2021
211f0f9
removing useless meta files
SamuelBellomo Sep 16, 2021
4ea092d
Merge branch 'develop' into sam/feature/interpolation-for-network-tra…
NoelStephensUnity Sep 16, 2021
6d3af5c
adding CanCommitToTransform public api. Since it's very likely author…
SamuelBellomo Sep 16, 2021
d97611c
formatting
SamuelBellomo Sep 16, 2021
127757c
Merge branch 'sam/feature/interpolation-for-network-transform' into s…
SamuelBellomo Sep 16, 2021
3234401
adding some warning in doc
SamuelBellomo Sep 16, 2021
8d15ed8
Merge branch 'develop' into sam/feature/client-network-transform
SamuelBellomo Sep 16, 2021
d1cb56d
Removing useless SetDirty
SamuelBellomo Sep 16, 2021
f34e7e6
teleport works
SamuelBellomo Sep 16, 2021
19eb53a
Merge branch 'develop' into sam/feature/client-network-transform
SamuelBellomo Sep 16, 2021
e59d506
reenabling net transform tests
SamuelBellomo Sep 16, 2021
90b2204
fixing CI issues
SamuelBellomo Sep 17, 2021
2d32231
Merge branch 'sam/feature/client-network-transform' of github.com:Uni…
SamuelBellomo Sep 17, 2021
a5f3fa3
adding input based transform sample
SamuelBellomo Sep 17, 2021
bcd66a0
Merge branch 'develop' into sam/feature/client-network-transform
SamuelBellomo Sep 17, 2021
8b9c645
adding compression, owner check, dirty check
SamuelBellomo Sep 17, 2021
e7b39d4
Merge branch 'sam/feature/client-network-transform' of github.com:Uni…
SamuelBellomo Sep 17, 2021
07fa849
missing private
SamuelBellomo Sep 17, 2021
2c3c009
removing useless sample, adding delta input per Matt's design
SamuelBellomo Sep 17, 2021
0c51b61
removing useless comments
SamuelBellomo Sep 17, 2021
3ee18dc
fixed tests, interpolation was depending on network manager singleton…
SamuelBellomo Sep 17, 2021
da23407
all current tests pass
SamuelBellomo Sep 17, 2021
bab085f
adding some tests todo
SamuelBellomo Sep 17, 2021
2bcb833
Merge branch 'sam/feature/client-network-transform' into sam/feature/…
SamuelBellomo Sep 17, 2021
8c4339b
format issues
SamuelBellomo Sep 17, 2021
23e7353
cleanup
SamuelBellomo Sep 17, 2021
409f400
Merge branch 'develop' into sam/feature/client-network-transform
SamuelBellomo Sep 17, 2021
5af2f6d
adding proper delta sending
SamuelBellomo Sep 17, 2021
6af71cc
Merge branch 'sam/feature/client-network-transform' into sam/feature/…
SamuelBellomo Sep 17, 2021
ee0712c
throwing exception instead of log warning
SamuelBellomo Sep 17, 2021
e8a1cc4
disabling client NT tests for now, seems like yamato doesn't handle s…
SamuelBellomo Sep 17, 2021
226af89
fixing issue with dynamically spawning players
SamuelBellomo Sep 17, 2021
9572e49
adding setter for client side changes
SamuelBellomo Sep 17, 2021
787422e
adding more instructions
SamuelBellomo Sep 17, 2021
d799ec1
allowing for pure server changes to owner based client net transform
SamuelBellomo Sep 17, 2021
2e8848b
Merge branch 'sam/feature/client-network-transform' into sam/feature/…
SamuelBellomo Sep 18, 2021
76f7f7a
Merge branch 'develop' into sam/feature/client-network-transform
SamuelBellomo Sep 18, 2021
a8a714b
work on setDelta
mattwalsh-unity Sep 18, 2021
85d7aff
delegate to allow server to override client changes
mattwalsh-unity Sep 19, 2021
17d17ee
fixing issue with tests where we had tickrate set to 0. Removed singl…
SamuelBellomo Sep 20, 2021
18cf2f0
Merge branch 'sam/feature/client-network-transform' into sam/feature/…
SamuelBellomo Sep 20, 2021
0291d0f
fix formatting
SamuelBellomo Sep 20, 2021
ffcdbb7
Merge branch 'develop' into sam/feature/client-network-transform
mattwalsh-unity Sep 20, 2021
1c8410b
removing delta
SamuelBellomo Sep 20, 2021
a6f85a5
Merge branch 'sam/feature/client-network-transform' of github.com:Uni…
SamuelBellomo Sep 20, 2021
e7da2a3
Merge branch 'sam/feature/client-network-transform' into sam/feature/…
SamuelBellomo Sep 20, 2021
98f963e
Merge branch 'develop' into sam/feature/transform-teleport
SamuelBellomo Sep 20, 2021
bff56c7
API consistency for teleport
SamuelBellomo Sep 20, 2021
3688410
adding teleport bool in SetState
SamuelBellomo Sep 20, 2021
d403e2a
fixing silly mistake
SamuelBellomo Sep 20, 2021
38d3814
Merge branch 'develop' into sam/feature/transform-teleport
mattwalsh-unity Sep 20, 2021
a40beb3
format
SamuelBellomo Sep 20, 2021
cb83a2e
Merge branch 'sam/feature/transform-teleport' of github.com:Unity-Tec…
SamuelBellomo Sep 20, 2021
7d58df8
adding missing check for builds
SamuelBellomo Sep 20, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 82 additions & 30 deletions com.unity.netcode.gameobjects/Components/NetworkTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,13 @@ internal struct NetworkTransformState : INetworkSerializable
private const int k_ScaleXBit = 7;
private const int k_ScaleYBit = 8;
private const int k_ScaleZBit = 9;
private const int k_TeleportingBit = 10;

// 10-15: <unused>
// 11-15: <unused>
private ushort m_Bitset;



public bool InLocalSpace
{
get => (m_Bitset & (1 << k_InLocalSpaceBit)) != 0;
Expand Down Expand Up @@ -136,6 +139,16 @@ public bool HasScaleZ
}
}

public bool IsTeleportingNextFrame
{
get => (m_Bitset & (1 << k_TeleportingBit)) != 0;
set
{
if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_TeleportingBit)); }
else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_TeleportingBit)); }
}
}

public float PositionX, PositionY, PositionZ;
public float RotAngleX, RotAngleY, RotAngleZ;
public float ScaleX, ScaleY, ScaleZ;
Expand Down Expand Up @@ -277,6 +290,10 @@ public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReade

private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native
private int m_LastSentTick;
private NetworkTransformState m_LastSentState;

private const string k_NoAuthorityMessage = "A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!";


/// <summary>
/// Tries updating the server authoritative transform, only if allowed.
Expand All @@ -288,17 +305,28 @@ public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReade
protected void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime)
{
var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, dirtyTime, transformToCommit);
TryCommit(isDirty);
}

void Send()
private void TryCommitValuesToServer(Vector3 position, Vector3 rotation, Vector3 scale, double dirtyTime)
{
var isDirty = ApplyTransformToNetworkStateWithInfo(ref m_LocalAuthoritativeNetworkState, dirtyTime, position, rotation, scale);

TryCommit(isDirty.isDirty);
}

private void TryCommit(bool isDirty)
{
void Send(NetworkTransformState stateToSend)
{
if (IsServer)
{
// server RPC takes a few frames to execute server side, we want this to execute immediately
CommitLocallyAndReplicate(m_LocalAuthoritativeNetworkState);
CommitLocallyAndReplicate(stateToSend);
}
else
{
CommitTransformServerRpc(m_LocalAuthoritativeNetworkState);
CommitTransformServerRpc(stateToSend);
}
}

Expand All @@ -311,14 +339,15 @@ void Send()
// making it immobile.
if (isDirty)
{
Send();
Send(m_LocalAuthoritativeNetworkState);
m_HasSentLastValue = false;
m_LastSentTick = NetworkManager.LocalTime.Tick;
m_LastSentState = m_LocalAuthoritativeNetworkState;
}
else if (!m_HasSentLastValue && NetworkManager.LocalTime.Tick >= m_LastSentTick + 1) // check for state.IsDirty since update can happen more than once per tick. No need for client, RPCs will just queue up
{
m_LocalAuthoritativeNetworkState.SentTime = NetworkManager.LocalTime.Time; // time 1+ tick later
Send();
m_LastSentState.SentTime = NetworkManager.LocalTime.Time; // time 1+ tick later
Send(m_LastSentState);
m_HasSentLastValue = true;
}
}
Expand All @@ -334,7 +363,6 @@ private void CommitTransformServerRpc(NetworkTransformState networkState, Server

private void CommitLocallyAndReplicate(NetworkTransformState networkState)
{
m_LocalAuthoritativeNetworkState = networkState;
m_ReplicatedNetworkState.Value = networkState;
AddInterpolatedState(networkState);
}
Expand Down Expand Up @@ -364,7 +392,11 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat
var position = InLocalSpace ? transformToUse.localPosition : transformToUse.position;
var rotAngles = InLocalSpace ? transformToUse.localEulerAngles : transformToUse.eulerAngles;
var scale = InLocalSpace ? transformToUse.localScale : transformToUse.lossyScale;
return ApplyTransformToNetworkStateWithInfo(ref networkState, dirtyTime, position, rotAngles, scale);
}

private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) ApplyTransformToNetworkStateWithInfo(ref NetworkTransformState networkState, double dirtyTime, Vector3 position, Vector3 rotAngles, Vector3 scale)
{
var isDirty = false;
var isPositionDirty = false;
var isRotationDirty = false;
Expand Down Expand Up @@ -484,17 +516,17 @@ private void ApplyInterpolatedNetworkStateToTransform(NetworkTransformState netw
// Position Read
if (SyncPositionX)
{
interpolatedPosition.x = Interpolate ? m_PositionXInterpolator.GetInterpolatedValue() : networkState.Position.x;
interpolatedPosition.x = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Position.x : m_PositionXInterpolator.GetInterpolatedValue();
}

if (SyncPositionY)
{
interpolatedPosition.y = Interpolate ? m_PositionYInterpolator.GetInterpolatedValue() : networkState.Position.y;
interpolatedPosition.y = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Position.y : m_PositionYInterpolator.GetInterpolatedValue();
}

if (SyncPositionZ)
{
interpolatedPosition.z = Interpolate ? m_PositionZInterpolator.GetInterpolatedValue() : networkState.Position.z;
interpolatedPosition.z = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Position.z : m_PositionZInterpolator.GetInterpolatedValue();
}

// again, we should be using quats here
Expand All @@ -503,34 +535,34 @@ private void ApplyInterpolatedNetworkStateToTransform(NetworkTransformState netw
var eulerAngles = m_RotationInterpolator.GetInterpolatedValue().eulerAngles;
if (SyncRotAngleX)
{
interpolatedRotAngles.x = Interpolate ? eulerAngles.x : networkState.Rotation.x;
interpolatedRotAngles.x = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Rotation.x : eulerAngles.x;
}

if (SyncRotAngleY)
{
interpolatedRotAngles.y = Interpolate ? eulerAngles.y : networkState.Rotation.y;
interpolatedRotAngles.y = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Rotation.y : eulerAngles.y;
}

if (SyncRotAngleZ)
{
interpolatedRotAngles.z = Interpolate ? eulerAngles.z : networkState.Rotation.z;
interpolatedRotAngles.z = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Rotation.z : eulerAngles.z;
}
}

// Scale Read
if (SyncScaleX)
{
interpolatedScale.x = Interpolate ? m_ScaleXInterpolator.GetInterpolatedValue() : networkState.Scale.x;
interpolatedScale.x = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Scale.x : m_ScaleXInterpolator.GetInterpolatedValue();
}

if (SyncScaleY)
{
interpolatedScale.y = Interpolate ? m_ScaleYInterpolator.GetInterpolatedValue() : networkState.Scale.y;
interpolatedScale.y = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Scale.y : m_ScaleYInterpolator.GetInterpolatedValue();
}

if (SyncScaleZ)
{
interpolatedScale.z = Interpolate ? m_ScaleZInterpolator.GetInterpolatedValue() : networkState.Scale.z;
interpolatedScale.z = networkState.IsTeleportingNextFrame || !Interpolate ? networkState.Scale.z : m_ScaleZInterpolator.GetInterpolatedValue();
}

// Position Apply
Expand Down Expand Up @@ -722,9 +754,11 @@ private void OnDestroy()
/// </summary>
/// <param name="posIn"></param> new position to move to. Can be null
/// <param name="rotIn"></param> new rotation to rotate to. Can be null
/// <param name="scaleIn"></param> new scale to scale to. Can be null
/// <param name="scaleIn">new scale to scale to. Can be null</param>
/// <param name="shouldGhostsInterpolate">Should other clients interpolate this change or not. True by default</param>
/// new scale to scale to. Can be null
/// <exception cref="Exception"></exception>
public void SetState(Vector3? posIn = null, Quaternion? rotIn = null, Vector3? scaleIn = null)
public void SetState(Vector3? posIn = null, Quaternion? rotIn = null, Vector3? scaleIn = null, bool shouldGhostsInterpolate = true)
{
if (!IsOwner)
{
Expand All @@ -744,29 +778,31 @@ public void SetState(Vector3? posIn = null, Quaternion? rotIn = null, Vector3? s
{
if (!IsServer)
{
SetStateServerRpc(pos, rot, scale);
SetStateServerRpc(pos, rot, scale, shouldGhostsInterpolate);
}
}
else
{
transform.position = pos;
transform.rotation = rot;
transform.localScale = scale;
m_Transform.position = pos;
m_Transform.rotation = rot;
m_Transform.localScale = scale;
m_LocalAuthoritativeNetworkState.IsTeleportingNextFrame = shouldGhostsInterpolate;
}
}

[ServerRpc]
private void SetStateServerRpc(Vector3 pos, Quaternion rot, Vector3 scale)
private void SetStateServerRpc(Vector3 pos, Quaternion rot, Vector3 scale, bool shouldTeleport)
{
// server has received this RPC request to move change transform. Give the server a chance to modify or
// even reject the move
if (OnClientRequestChange != null)
{
(pos, rot, scale) = OnClientRequestChange(pos, rot, scale);
}
transform.position = pos;
transform.rotation = rot;
transform.localScale = scale;
m_Transform.position = pos;
m_Transform.rotation = rot;
m_Transform.localScale = scale;
m_LocalAuthoritativeNetworkState.IsTeleportingNextFrame = shouldTeleport;
}
#endregion

Expand Down Expand Up @@ -818,23 +854,39 @@ protected virtual void Update()
// ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes
// from an unauthorized transform change or euler to quaternion conversion artifacts.
var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale";
Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this);
Debug.LogWarning(dirtyField + k_NoAuthorityMessage, this);
}

// Apply updated interpolated value
ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, m_Transform);
}
}

m_LocalAuthoritativeNetworkState.IsTeleportingNextFrame = false;
}

/// <summary>
/// Teleports the transform to the given values without interpolating
/// </summary>
public void Teleport(Vector3 newPosition, Quaternion newRotation, Vector3 newScale)
{
if (!CanCommitToTransform)
{
throw new Exception("Teleport not allowed, " + k_NoAuthorityMessage);
}

var newRotationEuler = newRotation.eulerAngles;
var stateToSend = m_LocalAuthoritativeNetworkState;
stateToSend.IsTeleportingNextFrame = true;
stateToSend.Position = newPosition;
stateToSend.Rotation = newRotationEuler;
stateToSend.Scale = newScale;
ApplyInterpolatedNetworkStateToTransform(stateToSend, transform);
// set teleport flag in state to signal to ghosts not to interpolate
m_LocalAuthoritativeNetworkState.IsTeleportingNextFrame = true;
// check server side
// set teleport flag in state
throw new NotImplementedException(); // TODO MTT-769
TryCommitValuesToServer(newPosition, newRotationEuler, newScale, NetworkManager.LocalTime.Time);
m_LocalAuthoritativeNetworkState.IsTeleportingNextFrame = false;
}
}
}
37 changes: 37 additions & 0 deletions testproject/Assets/SetTeleport.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#if UNITY_EDITOR
using System;
using Unity.Netcode.Components;
using UnityEditor;
using UnityEngine;

public class SetTeleport : MonoBehaviour
{
public void Set(Vector3 pos)
{
// GetComponent<NetworkTransform>().Teleport(pos, transform.rotation, transform.localScale);
GetComponent<NetworkTransform>().SetState(pos, transform.rotation, transform.localScale, false);
}

[CustomEditor(typeof(SetTeleport))]
public class GameEventEditor : Editor
{
private string m_Pos = "position";

public override void OnInspectorGUI()
{
base.OnInspectorGUI();

var setterObject = (SetTeleport)target;

GUILayout.TextArea($"Current pos: {setterObject.transform.position}");
m_Pos = GUILayout.TextField(m_Pos);

if (GUILayout.Button("Set"))
{
var posParsed = m_Pos.Split(',');
setterObject.Set(new Vector3(Convert.ToUInt32(posParsed[0]), Convert.ToUInt32(posParsed[1]), Convert.ToUInt32(posParsed[2])));
}
}
}
}
#endif
11 changes: 11 additions & 0 deletions testproject/Assets/SetTeleport.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.