- Home /
Network Sync Bullet 2D
I want to create a multiplayer SpaceShooter2D, but I have a problem, the client's bullet direction works in funtion of the mouse position of the host. On the bullet, the network transform and identity is attached, there is a empty where a network manager and HUD is attached and inside "Spawnable Prefabs" there is the bullet Prefab, please help me :
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking;
public class PlayerController : NetworkBehaviour { //Move public float _speed; private bool _move = false; public GameObject _point; private Vector3 _target; //Shot public GameObject bulletPrefab; public Transform bulletSpawn; public float TimeBullet; private Rigidbody2D rb; public float speed; public float fireRate; private float nextFire;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
if (!isLocalPlayer)
{
return;
}
Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
difference.Normalize();
float rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, rotation_z);
if (Input.GetMouseButton(1))
{
_target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
_target.z = transform.position.z;
if (_move == false)
_move = true;
Instantiate(_point, _target, Quaternion.identity);
{
if (Input.GetMouseButtonDown(1))
{
_move = false;
}
if (_move == true)
transform.position = Vector3.MoveTowards(transform.position, _target, _speed * Time.deltaTime);
}
}
if (Input.GetMouseButton(0))
{
CmdFire();
}
}
[Command]
void CmdFire()
{
if (Time.time > nextFire)
{
Vector2 target = Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
Vector2 bulletSpawner = new Vector2(bulletSpawn.transform.position.x, bulletSpawn.transform.position.y);
Vector2 direction = target - bulletSpawner;
direction.Normalize();
nextFire = Time.time + fireRate;
var bullet = (GameObject)Instantiate(bulletPrefab, bulletSpawn.transform.position, bulletSpawn.rotation);
// GameObject bullet = (GameObject)Instantiate(bulletPrefab, bulletSpawner, rotation);
rb = bullet.GetComponent<Rigidbody2D>();
rb.AddForce(direction * speed);
NetworkServer.Spawn(bullet);
Destroy(bullet, TimeBullet);
}
}
public override void OnStartLocalPlayer() { GetComponent().material.color = Color.blue; } }