i made a gun script. that shows error: NullReferenceException: Object reference not set to an instance of an object
gun.Shoot () (at Assets/code/gun.cs:132)<---- see script 1
(see void Shoot for gun.shoot)
PlayerAction.Update () (at Assets/PlayerAction.cs:11)<--- see script 2
script 1:
using System.Collections;
using UnityEngine.Pool;
using UnityEngine;
[CreateAssetMenu(fileName = "Gun", menuName = "guns/Gun", order = 4)]
public class gun : ScriptableObject
{
//public ImpactType ImpactType;
public GunTypes Type;
public string Name;
public GameObject ModelPrefab;
public Vector3 spawnpoint;
public Vector3 spawnrot;
public GunTypesScriptibule gunTypesScriptibule;
public TrainconfigScriptable trailconfigScriptable;
public MonoBehaviour ActiveMono;
private GameObject Model;
private float LastShootime;
public ParticleSystem ShootSystem;
private ObjectPool TrailPool;
public void Spawn(Transform Parent, MonoBehaviour Activemono)
{
this.ActiveMono = ActiveMono;
LastShootime = 0;
TrailPool = new ObjectPool(CreateTrail);
Model = Instantiate(ModelPrefab);
Model.transform.SetParent(Parent, false);
Model.transform.localPosition = spawnpoint;
Model.transform.localRotation = Quaternion.Euler(spawnrot);
}
private IEnumerator PlayTrail(Vector3 startPoint, Vector3 EndPoint, RaycastHit hit)
{
TrailRenderer instance = TrailPool.Get();
instance.gameObject.SetActive(true);
instance.transform.position = startPoint;
yield return null;
instance.emitting = true;
float Distance = Vector3.Distance(startPoint, EndPoint);
float remaningDistance = Distance;
while(remaningDistance > 0)
{
instance.transform.position = Vector3.Lerp(
startPoint,
EndPoint,
Mathf.Clamp01(1 - (remaningDistance / Distance))
);
remaningDistance -= trailconfigScriptable.simspeed * Time.deltaTime;
yield return null;
}
instance.transform.position = EndPoint;
//if(hit.collider != null)
//{
//SurfaceManager.Instance.HandleImpact(
//hit.transform.gameObject,
//EndPoint,
//hit.normal,
//ImpactType,
//0
//);
//}
yield return new WaitForSeconds(trailconfigScriptable.Duation);
instance.emitting = false;
instance.gameObject.SetActive(false);
TrailPool.Release(instance);
}
private TrailRenderer CreateTrail()
{
GameObject instance = new GameObject("Bullet Trail");
TrailRenderer trail = instance.AddComponent();
trail.colorGradient = trailconfigScriptable.Colour;
trail.material = trailconfigScriptable.material;
trail.widthCurve = trailconfigScriptable.WidthCurve;
trail.time = trailconfigScriptable.Duation;
trail.minVertexDistance = trailconfigScriptable.MinVertexDistance;
trail.emitting = false;
trail.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
return trail;
}
public void Shoot()
{
if (Time.time > gunTypesScriptibule.FireRate + LastShootime)
{
LastShootime = Time.time;
ShootSystem.Play();
Vector3 shootDirection = ShootSystem.transform.forward
+ new Vector3(
Random.Range(
-gunTypesScriptibule.Spread.x,
gunTypesScriptibule.Spread.x
),
Random.Range(
-gunTypesScriptibule.Spread.y,
gunTypesScriptibule.Spread.y
),
Random.Range(
-gunTypesScriptibule.Spread.z,
gunTypesScriptibule.Spread.z
)
);
shootDirection.Normalize();
if (Physics.Raycast(
ShootSystem.transform.position,
shootDirection,
out RaycastHit hit,
float.MaxValue,
gunTypesScriptibule.HitMask
))
{
ActiveMono.StartCoroutine(
PlayTrail(
ShootSystem.transform.position,
hit.point,
hit
)
);
}
else
{
ActiveMono.StartCoroutine(
PlayTrail(
ShootSystem.transform.position,
ShootSystem.transform.position + (shootDirection * trailconfigScriptable.missDistance),
new RaycastHit()
)
);
}
}
}
}
script 2:
using UnityEngine;
public class PlayerAction : MonoBehaviour
{
public WeponSwitch Gunselect;
private void Update()
{
if (Input.GetButton("Fire1") && Gunselect.Activegun != null)
{
Gunselect.Activegun.Shoot();
}
}
}
↧