66 lines
1.9 KiB
C#
66 lines
1.9 KiB
C#
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<Rigidbody>();
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|