- Home /
Question by
arduinomacerasi · Dec 26, 2020 at 11:35 AM ·
networkingmirror
InvalidProgramException: Invalid IL code? Mirror
This is not duplicate of any other issue
I wanted to Network Transform component to work with UDP. So I installed Ignorance.
And I wrote my own version of NetworkTransformBase component to work with UDP.
The code is:
using Mirror;
using UnityEngine;
public abstract class NetworkTransformBase : NetworkBehaviour
{
protected abstract Transform targetTransform { get; }
[Header("Authority")]
[Tooltip("Set to true if moves come from owner client, set to false if moves always come from server")]
[SyncVar]
public bool clientAuthority;
[Header("Synchronization")]
[Tooltip("Set to true if position should be synchronized")]
[SyncVar]
public bool syncPosition = true;
[Tooltip("Set to true if rotation should be synchronized")]
[SyncVar]
public bool syncRotation = true;
[Tooltip("Set to true if scale should be synchronized")]
[SyncVar]
public bool syncScale = true;
[Header("Interpolation")]
[Tooltip("Set to true if position should be interpolated")]
[SyncVar]
public bool interpolatePosition = true;
[Tooltip("Set to true if rotation should be interpolated")]
[SyncVar]
public bool interpolateRotation = true;
[Tooltip("Set to true if scale should be interpolated")]
[SyncVar]
public bool interpolateScale = true;
protected Vector3 positionGoal;
protected Quaternion rotationGoal;
protected Vector3 scaleGoal;
private void Update()
{
ServerUpdate();
ClientUpdate();
}
[Client]
protected void ClientUpdate()
{
ClientTransformUpdate(targetTransform.position, targetTransform.rotation, targetTransform.localScale);
}
[Server]
protected void ServerUpdate()
{
TransformUpdate(targetTransform.position, targetTransform.rotation, targetTransform.localScale);
InterpolatePosition(targetTransform.position);
}
[Command(channel = 1)] //Set to UDP
public void ClientTransformUpdate(Vector3 position, Quaternion rotation, Vector3 scale)
{
if (clientAuthority)
{
if(syncPosition) targetTransform.position = position;
if(syncRotation) targetTransform.rotation = rotation;
if(syncScale) targetTransform.localScale = scale;
}
}
[ClientRpc(channel = 1)] //Set to UDP
public void TransformUpdate(Vector3 position, Quaternion rotation, Vector3 scale)
{
if(!clientAuthority)
{
if(syncPosition) positionGoal = position;
if(syncRotation) targetTransform.rotation = rotation;
if(syncScale) targetTransform.localScale = scale;
}
}
protected Vector3 InterpolatePosition(Vector3 currentPosition)
{
if (!interpolatePosition)
return currentPosition;
float speed = 0.5f;
return Vector3.MoveTowards(currentPosition, positionGoal, speed * Time.deltaTime);
}
}
And the non-abstract code is: using UnityEngine;
[DisallowMultipleComponent]
[AddComponentMenu("CodeEasyYT Networking/Network Transform")]
public class NetworkTransform : NetworkTransformBase
{
protected override Transform targetTransform => transform;
}
But I get this error:
InvalidProgramException: Invalid IL code in NetworkTransformBase:ServerUpdate (): IL_000f: call 0x0a00000a
NetworkTransformBase.Update () (at Assets/Scripts/NetworkTransformBase.cs:48)
Please help.
Comment