Browse Source

Added a scene to experiment with split-screen running multiple instances of the game. Added the ability to override the default engine library name, and added additional layers for camera masking.

readme
Nico de Poel 5 years ago
parent
commit
592c326b53
  1. 1221
      Assets/Scenes/SplitScreenTest.unity
  2. 7
      Assets/Scenes/SplitScreenTest.unity.meta
  3. 9
      Assets/Scripts/Layers.cs
  4. 63
      Assets/Scripts/SplitScreenTest.cs
  5. 11
      Assets/Scripts/SplitScreenTest.cs.meta
  6. 11
      Assets/Scripts/UniQuake.Interop.cs
  7. 2
      Assets/Scripts/UniQuake.cs
  8. 12
      ProjectSettings/TagManager.asset

1221
Assets/Scenes/SplitScreenTest.unity
File diff suppressed because it is too large
View File

7
Assets/Scenes/SplitScreenTest.unity.meta

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4ca6e7235b69a0d4dbe7cadc2b23fb6e
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

9
Assets/Scripts/Layers.cs

@ -2,6 +2,15 @@
{ {
Game1 = 6, Game1 = 6,
ViewModel1 = 7, ViewModel1 = 7,
Game2 = 9,
ViewModel2 = 10,
Game3 = 12,
ViewModel3 = 13,
Game4 = 15,
ViewModel4 = 16,
} }
public static class LayerExtensions public static class LayerExtensions

63
Assets/Scripts/SplitScreenTest.cs

@ -0,0 +1,63 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SplitScreenTest : MonoBehaviour
{
[SerializeField]
private GameInstance[] gameInstances = new GameInstance[4];
[SerializeField]
private List<VisualStyle> visualStyles = new List<VisualStyle>();
private void Start()
{
Debug.Log($"Running in {IntPtr.Size * 8}-bit mode");
Layers gameLayer = Layers.Game1;
Layers viewLayer = Layers.ViewModel1;
int layerStride = Layers.Game2 - Layers.Game1;
foreach (var gameInstance in gameInstances)
{
if (gameInstance == null || gameInstance.mainCamera == null)
continue;
var uq = gameObject.AddComponent<UniQuake>();
uq.BaseGame = gameInstance.baseGame;
uq.ModDirectory = gameInstance.modPath;
uq.AdditionalArguments = ParseArgs(gameInstance.arguments);
uq.Camera = gameInstance.mainCamera;
uq.GameLayer = gameLayer;
uq.ViewModelLayer = viewLayer;
uq.LibraryOverride = gameInstance.libraryName;
uq.SetVisualStyle(visualStyles[0]);
gameLayer += layerStride;
viewLayer += layerStride;
}
}
private string[] ParseArgs(string args)
{
if (args == null)
return new string[0];
return args.Split(new[] {' ', '\t', '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
}
[Serializable]
public class GameInstance
{
public Camera mainCamera;
public MissionPack baseGame;
public string modPath;
public string arguments;
public string libraryName;
}
}

11
Assets/Scripts/SplitScreenTest.cs.meta

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 47d8bb9d10da63c4d9b96cb96a94aca3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

11
Assets/Scripts/UniQuake.Interop.cs

@ -38,11 +38,12 @@ public partial class UniQuake
string dllFile = Path.Combine(Application.dataPath, DllPath); string dllFile = Path.Combine(Application.dataPath, DllPath);
// Experimental code to allow running multiple instances of Quake next to each other // Experimental code to allow running multiple instances of Quake next to each other
// string dllName = Path.GetFileNameWithoutExtension(dllFile);
// string dllExt = Path.GetExtension(dllFile);
// string dllCopy = Path.Combine(Application.persistentDataPath, $"{dllName}{GetInstanceID()}{dllExt}");
// File.Copy(dllFile, dllCopy, true);
// dllFile = dllCopy;
if (!string.IsNullOrEmpty(LibraryOverride))
{
string directory = Path.GetDirectoryName(dllFile);
string extension = Path.GetExtension(dllFile);
dllFile = Path.Combine(directory, LibraryOverride + extension);
}
libraryHandle = SystemLibrary.LoadLibrary(dllFile); libraryHandle = SystemLibrary.LoadLibrary(dllFile);
if (libraryHandle == IntPtr.Zero) if (libraryHandle == IntPtr.Zero)

2
Assets/Scripts/UniQuake.cs

@ -28,6 +28,8 @@ public partial class UniQuake: MonoBehaviour
public string ModDirectory { get; set; } public string ModDirectory { get; set; }
public string[] AdditionalArguments { get; set; } public string[] AdditionalArguments { get; set; }
public string LibraryOverride { get; set; }
/// <summary> /// <summary>
/// Time since startup for this particular instance of Quake /// Time since startup for this particular instance of Quake
/// </summary> /// </summary>

12
ProjectSettings/TagManager.asset

@ -14,14 +14,14 @@ TagManager:
- Game1 - Game1
- ViewModel1 - ViewModel1
- -
- Game2
- ViewModel2
- -
- Game3
- ViewModel3
- -
-
-
-
-
-
-
- Game4
- ViewModel4
- -
- -
- -

Loading…
Cancel
Save