mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 19:10:32 +00:00
Predicted Billiards: fix dragging with predicted Rigidbody
This commit is contained in:
parent
a3e8ef0b8f
commit
8334f3549c
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Mirror.Examples.BilliardsPredicted
|
||||
@ -5,6 +6,7 @@ namespace Mirror.Examples.BilliardsPredicted
|
||||
public class WhiteBallPredicted : NetworkBehaviour
|
||||
{
|
||||
public LineRenderer dragIndicator;
|
||||
public float dragTolerance = 1.0f;
|
||||
public Rigidbody rigidBody;
|
||||
public float forceMultiplier = 2;
|
||||
public float maxForce = 40;
|
||||
@ -12,6 +14,8 @@ public class WhiteBallPredicted : NetworkBehaviour
|
||||
// remember start position to reset to after entering a pocket
|
||||
Vector3 startPosition;
|
||||
|
||||
bool draggingStartedOverObject;
|
||||
|
||||
// cast mouse position on screen to world position
|
||||
bool MouseToWorld(out Vector3 position)
|
||||
{
|
||||
@ -31,6 +35,77 @@ void Awake()
|
||||
startPosition = transform.position;
|
||||
}
|
||||
|
||||
[ClientCallback]
|
||||
void Update()
|
||||
{
|
||||
// mouse down on the white ball?
|
||||
if (Input.GetMouseButtonDown(0))
|
||||
{
|
||||
if (MouseToWorld(out Vector3 position))
|
||||
{
|
||||
// allow dragging if mouse is 'close enough'.
|
||||
// balls are moving so we don't need to be exactly on it.
|
||||
float distance = Vector3.Distance(position, transform.position);
|
||||
if (distance <= dragTolerance)
|
||||
{
|
||||
// enable drag indicator
|
||||
dragIndicator.SetPosition(0, transform.position);
|
||||
dragIndicator.SetPosition(1, transform.position);
|
||||
dragIndicator.gameObject.SetActive(true);
|
||||
|
||||
draggingStartedOverObject = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// mouse button dragging?
|
||||
else if (Input.GetMouseButton(0))
|
||||
{
|
||||
// cast mouse position to world
|
||||
if (draggingStartedOverObject && MouseToWorld(out Vector3 current))
|
||||
{
|
||||
// drag indicator
|
||||
dragIndicator.SetPosition(0, transform.position);
|
||||
dragIndicator.SetPosition(1, current);
|
||||
}
|
||||
}
|
||||
// mouse button up?
|
||||
else if (Input.GetMouseButtonUp(0))
|
||||
{
|
||||
// cast mouse position to world
|
||||
if (draggingStartedOverObject && MouseToWorld(out Vector3 current))
|
||||
{
|
||||
// calculate delta from ball to mouse
|
||||
// ball may have moved since we started dragging,
|
||||
// so always use current ball position here.
|
||||
Vector3 from = transform.position;
|
||||
|
||||
// debug drawing: only works if Gizmos are enabled!
|
||||
Debug.DrawLine(from, current, Color.white, 2);
|
||||
|
||||
// calculate pending force delta
|
||||
Vector3 delta = from - current;
|
||||
Vector3 force = delta * forceMultiplier;
|
||||
|
||||
// there should be a maximum allowed force
|
||||
force = Vector3.ClampMagnitude(force, maxForce);
|
||||
|
||||
// forward the event to the local player's object.
|
||||
// the ball isn't part of the local player.
|
||||
NetworkClient.localPlayer.GetComponent<PlayerPredicted>().OnDraggedBall(force);
|
||||
|
||||
// disable drag indicator
|
||||
dragIndicator.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
draggingStartedOverObject = false;
|
||||
}
|
||||
}
|
||||
|
||||
// OnMouse callbacks don't work for predicted objects because we need to
|
||||
// move the collider out of the main object ocassionally.
|
||||
// besides, having a drag tolerance and not having to click exactly on
|
||||
// the white ball is nice.
|
||||
/*
|
||||
[ClientCallback]
|
||||
void OnMouseDown()
|
||||
{
|
||||
@ -79,6 +154,7 @@ void OnMouseUp()
|
||||
// disable drag indicator
|
||||
dragIndicator.gameObject.SetActive(false);
|
||||
}
|
||||
*/
|
||||
|
||||
// reset position when entering a pocket.
|
||||
// there's only one trigger in the scene (the pocket).
|
||||
|
Loading…
Reference in New Issue
Block a user