Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
107 changes: 96 additions & 11 deletions Multiplayer Lab 02/Assets/Scripts/Multiplayer/Lab02a_PlayerControl.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,100 @@
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Security;

public class Lab02a_PlayerControl : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
public class Lab02a_PlayerControl : NetworkBehaviour {
#region Fields

[SyncVar] PlayerState state;

#endregion

// Use this for initialization
void Start() {
InitState();
SyncState();
}

// Update is called once per frame
void Update() {
if (isLocalPlayer) {
KeyCode[] possibleKeys = {KeyCode.A, KeyCode.S, KeyCode.D, KeyCode.W, KeyCode.Q, KeyCode.E, KeyCode.Space};
foreach (KeyCode possibleKey in possibleKeys) {
//if ( !Input.GetKey( possibleKey ) ) {
// continue;
//}
//CmdMoveOnServer( possibleKey );

if (Input.GetKey(possibleKey)) {
CmdMoveOnServer(possibleKey);
}
}

SyncState();
}
}

[Command]
void CmdMoveOnServer(KeyCode pressedKey) {
state = Move(state, pressedKey);
}

PlayerState Move(PlayerState previous, KeyCode newKey) {
float deltaX = 0, deltaY = 0, deltaZ = 0;
float deltaRotationY = 0;

switch (newKey) {
case KeyCode.Q:
deltaX = -0.5f;
break;
case KeyCode.S:
deltaZ = -0.5f;
break;
case KeyCode.E:
deltaX = 0.5f;
break;
case KeyCode.W:
deltaZ = 0.5f;
break;
case KeyCode.A:
deltaRotationY = -1f;
break;
case KeyCode.D:
deltaRotationY = 1f;
break;
}

return new PlayerState {
posX = deltaX + previous.posX,
posY = deltaY + previous.posY,
posZ = deltaZ + previous.posZ,
rotX = previous.rotX,
rotY = deltaRotationY + previous.rotY,
rotZ = previous.rotZ
};
}

void SyncState() {
transform.position = new Vector3(state.posX, state.posY, state.posZ);
transform.rotation = Quaternion.Euler(state.rotX, state.rotY, state.rotZ);
}

[Server]
void InitState() {
state = new PlayerState {
posX = -119f,
posY = 165.08f,
posZ = -924f,
rotX = 0f,
rotY = 0f,
rotZ = 0f
};
}
}

public struct PlayerState {
public float posX, posY, posZ;
public float rotX, rotY, rotZ;
public int movementNumber;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
using UnityEngine;
using UnityEngine.Networking;
using System.Collections.Generic;
using System;

/// <summary>
/// Author: Matt Gipson
/// Contact: Deadwynn@gmail.com
/// Domain: www.livingvalkyrie.com
///
/// Description: Lab02b_PlayerControlPrediction
/// </summary>
public class Lab02b_PlayerControlPrediction : NetworkBehaviour {
#region Fields

[SyncVar(hook = "OnServerStateChanged")]
PlayerState serverState;
PlayerState predictedState;

Queue<KeyCode> pendingMoves;

#endregion

// Use this for initialization
void Start() {
InitState();
predictedState = serverState;
if (isLocalPlayer) {
pendingMoves = new Queue<KeyCode>();
UpdatePredictedState();
}
SyncState();
}

// Update is called once per frame
void Update() {
if ( isLocalPlayer ) {
print("Pending moves: " + pendingMoves.Count);

KeyCode[] possibleKeys = { KeyCode.A, KeyCode.S, KeyCode.D, KeyCode.W, KeyCode.Q, KeyCode.E, KeyCode.Space };
foreach ( KeyCode possibleKey in possibleKeys ) {
//if ( !Input.GetKey( possibleKey ) ) {
// continue;
//}
//CmdMoveOnServer( possibleKey );

if ( Input.GetKey( possibleKey ) ) {
CmdMoveOnServer( possibleKey );
}

pendingMoves.Enqueue(possibleKey);
UpdatePredictedState();
CmdMoveOnServer(possibleKey);
}

}

SyncState();

}

[Command]
void CmdMoveOnServer( KeyCode pressedKey ) {
serverState = Move(serverState, pressedKey);
}

PlayerState Move( PlayerState previous, KeyCode newKey ) {
float deltaX = 0, deltaY = 0, deltaZ = 0;
float deltaRotationY = 0;

switch ( newKey ) {
case KeyCode.Q:
deltaX = -0.5f;
break;
case KeyCode.S:
deltaZ = -0.5f;
break;
case KeyCode.E:
deltaX = 0.5f;
break;
case KeyCode.W:
deltaZ = 0.5f;
break;
case KeyCode.A:
deltaRotationY = -1f;
break;
case KeyCode.D:
deltaRotationY = 1f;
break;
}

return new PlayerState {
movementNumber = 1 + previous.movementNumber,
posX = deltaX + previous.posX,
posY = deltaY + previous.posY,
posZ = deltaZ + previous.posZ,
rotX = previous.rotX,
rotY = deltaRotationY + previous.rotY,
rotZ = previous.rotZ
};
}

void SyncState() {
PlayerState stateToRender = isLocalPlayer ? predictedState : serverState;

transform.position = new Vector3(stateToRender.posX, stateToRender.posY, stateToRender.posZ);
transform.rotation = Quaternion.Euler(stateToRender.rotX, stateToRender.rotY, stateToRender.rotZ);
}

void OnServerStateChanged(PlayerState newState) {
serverState = newState;
if (pendingMoves != null) {
while (pendingMoves.Count > (predictedState.movementNumber - serverState.movementNumber)) {
pendingMoves.Dequeue();
}
UpdatePredictedState();
}
}

void UpdatePredictedState() {
predictedState = serverState;
foreach (KeyCode pendingMove in pendingMoves) {
predictedState = Move(predictedState, pendingMove);
}
}

[Server]
void InitState() {
serverState = new PlayerState {
posX = -119f,
posY = 165.08f,
posZ = -924f,
rotX = 0f,
rotY = 0f,
rotZ = 0f
};
}
}

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

Original file line number Diff line number Diff line change
Expand Up @@ -1446,6 +1446,7 @@ GameObject:
- 114: {fileID: 11486774}
- 114: {fileID: 11480636}
- 114: {fileID: 11411396}
- 114: {fileID: 11496512}
m_Layer: 0
m_Name: Player V2
m_TagString: Player
Expand Down Expand Up @@ -3403,7 +3404,6 @@ Camera:
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
Expand Down Expand Up @@ -3569,6 +3569,17 @@ MonoBehaviour:
i15: 1
m_ServerOnly: 0
m_LocalPlayerAuthority: 1
--- !u!114 &11496512
MonoBehaviour:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 180002}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6f68649ab6382194195101fcaddf3cdd, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!136 &13683388
CapsuleCollider:
m_ObjectHideFlags: 1
Expand Down
Loading