using System.Collections; using System.Collections.Generic; using Photon.Pun; using UnityEngine; public class BulletImpactReceiver : MonoBehaviourPunCallbacks { Rigidbody rb; public float impactMultiplier = 1; private float dev_impactMultiplier=1; public float maxDist = 20; public float curVelocity; public float freezeVelocity = 0.1f; void Awake(){ transform.tag = "BulletImpactReceiver"; rb= GetComponent(); } void Start(){ SettingsManager.instance.OnSettingsChanged.AddListener(OnSettingsChanged); } void OnSettingsChanged(){ dev_impactMultiplier = SettingsManager.instance.ballBounceSlider.value; } public void OnHit(Vector3? point, Vector3? normal, Vector3 shooterPos){ rb.isKinematic = false; if(point == null || normal == null){return;} float dist = Vector3.Distance(shooterPos, (Vector3)point); Vector3 force = ((Vector3)normal) *( dev_impactMultiplier*impactMultiplier * (maxDist / dist)); if(photonView.IsMine){ OnImpact((Vector3)point, force); }else{ photonView.RPC("RpcOnImpact", RpcTarget.All, point, force); } } void Update(){ curVelocity = rb.velocity.sqrMagnitude; if(rb.velocity.sqrMagnitude < freezeVelocity && !rb.isKinematic){ rb.isKinematic = true; } } [PunRPC] void RpcOnImpact(Vector3 point, Vector3 force){ if(photonView.IsMine){ OnImpact(point, force); } } void OnImpact(Vector3 point, Vector3 force){ rb.AddForceAtPosition(force, (Vector3)point); } void OnCollisionEnter(Collision collision){ Debug.Log("Pool ball collided with " + collision.collider.name); if(collision.collider.tag == "Player"){ rb.AddForce(-collision.impulse, ForceMode.Impulse); } } }