using DarkRift; using DarkRift.Client; using DarkRift.Client.Unity; using UnityEngine; public class DragObject : MonoBehaviour { /// /// The tag indicating a movement of the object. /// const ushort MOVE_TAG = 0; [SerializeField] [Tooltip("The client to communicate with the server via.")] UnityClient client; [SerializeField] [Tooltip("The ID to identify this object across the network using")] byte dragID; [SerializeField] [Tooltip("The speed at which the object will drag at.")] float speed = 15; /// /// This will be an object used to smoothly move between positions. /// Vector3 targetPosition; void Awake () { //Check we have a client to send/receive from if (client == null) { Debug.LogError("No client assigned to DragObject!"); return; } //Subscribe to the event for when we receive messages client.MessageReceived += Client_MessageReceived; //Set our default target position to our current position targetPosition = transform.position; } void Update() { //Lerp between positions to create a smoother transition transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * speed); } void Client_MessageReceived(object sender, MessageReceivedEventArgs e) { using (Message message = e.GetMessage() as Message) { //Check the message has a zero tag if (message.Tag == MOVE_TAG) { //Get the reader from the message so we can read the data using (DarkRiftReader reader = message.GetReader()) { //If it's for us... if (reader.ReadByte() == dragID) { //... then update our position! targetPosition = new Vector3(reader.ReadSingle(), reader.ReadSingle(), 0); } } } } } //Called when the object is dragged by the mouse void OnMouseDrag () { //Check we have a client to send from if (client == null) { Debug.LogError("No client assigned to DragObject!"); return; } //Firstly we need to work out where the object should be, we can ignore the z-coord returned Vector3 newPos = Camera.main.ScreenPointToRay(Input.mousePosition).GetPoint(10); //We want to send the new position of the object to the other clients so we write our ID and //our position (as x, y and z components) into a DarkRiftWriter using (DarkRiftWriter writer = DarkRiftWriter.Create()) { writer.Write(dragID); writer.Write(newPos.x); writer.Write(newPos.y); //Then we'll create a new message and put the DarkRiftWriter into it. //The tag indicates what the message is about so we'll put a tag of '0' to indicate a //movement. using (Message message = Message.Create(MOVE_TAG, writer)) { //We can then send the message client.SendMessage(message, SendMode.Unreliable); } } //Last but not least we'll actually move the object on our screen so set the target position to //the new position targetPosition = new Vector3(newPos.x, newPos.y, 0); } }