Skip to content

Commit e01bc76

Browse files
feat: add optional position and rotation to the ElympicsMonoBehaviour.ElympicsInstantiate method
1 parent f76ec94 commit e01bc76

5 files changed

Lines changed: 48 additions & 13 deletions

File tree

Runtime/Behaviour/ElympicsMonoBehaviour.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,23 @@ internal ElympicsBase ElympicsBase
7272
/// <param name="player">The player for whom the instantiated object will be predictable.</param>
7373
/// <returns>Created game object.</returns>
7474
/// <remarks>For object destruction see <see cref="ElympicsDestroy"/>.</remarks>
75-
public GameObject ElympicsInstantiate(string pathInResources, ElympicsPlayer player)
75+
public GameObject ElympicsInstantiate(string pathInResources, ElympicsPlayer player) => InstantiateInternal(pathInResources, player, null);
76+
77+
/// <param name="position">Position in the world space where the prefab will be instantiated.</param>
78+
/// <param name="rotation">Rotation applied to the instantiated prefab.</param>
79+
/// <inheritdoc cref="ElympicsInstantiate(string,ElympicsPlayer)"/>/>
80+
public GameObject ElympicsInstantiate(string pathInResources, ElympicsPlayer player, Vector3 position, Quaternion rotation) => InstantiateInternal(pathInResources, player, new(position, rotation));
81+
82+
private GameObject InstantiateInternal(string pathInResources, ElympicsPlayer player, InstantiatedTransformConfig? transformConfig)
7683
{
7784
if (!Elympics.IsServer && !_elympics.Config.Prediction)
7885
throw new ElympicsException($"You cannot use {nameof(ElympicsInstantiate)} as a client or bot when prediction is disabled.");
7986

8087
ThrowIfCalledInWrongContextWithPlayer(player);
81-
return GetFactory().CreateInstance(pathInResources, player);
88+
return GetFactory().CreateInstance(pathInResources, player, transformConfig);
8289
}
8390

91+
8492
[SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local")]
8593
private void ThrowIfCalledInWrongContextWithPlayer(ElympicsPlayer player, [CallerMemberName] string caller = "")
8694
{

Runtime/Behaviour/Factory/ElympicsFactory.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ internal void Initialize(IElympics elympics, Action<ElympicsBehaviour> addBehavi
4747
_elympicsFactoryPartsToRemove = new List<ElympicsPlayer>();
4848
}
4949

50-
internal GameObject CreateInstance(string pathInResources, ElympicsPlayer player)
50+
internal GameObject CreateInstance(string pathInResources, ElympicsPlayer player, InstantiatedTransformConfig? transformConfig)
5151
{
5252
var elympicsFactoryPart = GetOrCreateFactoryPart(player);
53-
return elympicsFactoryPart.CreateInstance(pathInResources);
53+
return elympicsFactoryPart.CreateInstance(pathInResources, transformConfig);
5454
}
5555

5656
internal void DestroyInstance(GameObject go)
@@ -158,9 +158,9 @@ private void RemoveFactoryPart(ElympicsPlayer player)
158158
_ = _elympicsFactoryParts.Remove(player);
159159
}
160160

161-
private GameObject Instantiate(ElympicsPlayer player, GameObject prefabGameObject)
161+
private GameObject Instantiate(ElympicsPlayer player, GameObject prefabGameObject, InstantiatedTransformConfig? transformConfig)
162162
{
163-
var instantiatedGameObject = Instantiate(prefabGameObject);
163+
var instantiatedGameObject = transformConfig.HasValue ? Instantiate(prefabGameObject, transformConfig.Value.Position, transformConfig.Value.Rotation) : Instantiate(prefabGameObject);
164164
_playersObjects.Add(instantiatedGameObject, player);
165165
return instantiatedGameObject;
166166
}

Runtime/Behaviour/Factory/ElympicsFactoryPart.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Elympics
88
{
99
internal class ElympicsFactoryPart
1010
{
11-
private readonly Func<ElympicsPlayer, GameObject, GameObject> _instantiate;
11+
private readonly Func<ElympicsPlayer, GameObject, InstantiatedTransformConfig?, GameObject> _instantiate;
1212
private readonly Action<ElympicsPlayer, GameObject> _destroy;
1313
private readonly Action<ElympicsBehaviour> _addBehaviour;
1414
private readonly Action<int> _removeBehaviour;
@@ -21,7 +21,7 @@ internal class ElympicsFactoryPart
2121
private readonly Dictionary<int, CreatedInstanceWrapper> _createdInstanceWrappersCache;
2222
private readonly Dictionary<GameObject, int> _createdGameObjectsIds;
2323

24-
internal ElympicsFactoryPart(ElympicsPlayer player, Func<ElympicsPlayer, GameObject, GameObject> instantiate, Action<ElympicsPlayer, GameObject> destroy, Action<ElympicsBehaviour> addBehaviour, Action<int> removeBehaviour)
24+
internal ElympicsFactoryPart(ElympicsPlayer player, Func<ElympicsPlayer, GameObject, InstantiatedTransformConfig?, GameObject> instantiate, Action<ElympicsPlayer, GameObject> destroy, Action<ElympicsBehaviour> addBehaviour, Action<int> removeBehaviour)
2525
{
2626
_player = player;
2727

@@ -70,7 +70,7 @@ private void OnPostDataDeserialize()
7070
foreach (var instanceData in instancesToAdd)
7171
{
7272
_currentNetworkId.MoveTo(instanceData.PrecedingNetworkIdEnumeratorValue);
73-
_ = CreateInstanceInternal(instanceData.ID, instanceData.InstanceType);
73+
_ = CreateInstanceInternal(instanceData.ID, instanceData.InstanceType, null);
7474
}
7575

7676
_instancesData.ApplyIncomingInstances();
@@ -79,18 +79,18 @@ private void OnPostDataDeserialize()
7979
_currentNetworkId.MoveTo(cachedNetworkIdEnumerator);
8080
}
8181

82-
internal GameObject CreateInstance(string pathInResources)
82+
internal GameObject CreateInstance(string pathInResources, InstantiatedTransformConfig? transformConfig)
8383
{
8484
var instanceId = _instancesData.Add(_currentNetworkId.GetCurrent(), pathInResources);
85-
var instanceWrapper = CreateInstanceInternal(instanceId, pathInResources);
85+
var instanceWrapper = CreateInstanceInternal(instanceId, pathInResources, transformConfig);
8686
return instanceWrapper.GameObject;
8787
}
8888

89-
private CreatedInstanceWrapper CreateInstanceInternal(int instanceId, string pathInResources)
89+
private CreatedInstanceWrapper CreateInstanceInternal(int instanceId, string pathInResources, InstantiatedTransformConfig? transformConfig)
9090
{
9191
var createdPrefab = Resources.Load<GameObject>(pathInResources)
9292
?? throw new ArgumentException($"Prefab you want to instantiate ({pathInResources}) does not exist");
93-
var createdGameObject = _instantiate(_player, createdPrefab);
93+
var createdGameObject = _instantiate(_player, createdPrefab, transformConfig);
9494
var elympicsBehaviours = createdGameObject.GetComponentsInChildren<ElympicsBehaviour>(true);
9595
foreach (var behaviour in elympicsBehaviours)
9696
{
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using UnityEngine;
2+
3+
namespace Elympics
4+
{
5+
internal readonly struct InstantiatedTransformConfig
6+
{
7+
public readonly Vector3 Position;
8+
public readonly Quaternion Rotation;
9+
10+
public InstantiatedTransformConfig(Vector3 position, Quaternion rotation)
11+
{
12+
Position = position;
13+
Rotation = rotation;
14+
}
15+
}
16+
}

Runtime/Behaviour/InstantiatedTransformConfig.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)