Search Unity

Bullet collision help

Discussion in 'Physics' started by camlam999, Jan 5, 2015.

  1. camlam999

    camlam999

    Joined:
    Aug 8, 2014
    Posts:
    29
    so i have a soldier and i want him to shoot an enemy but when he does i want the enemy to become a ragdoll also i can't make the enemy read the bullet collision all though i know it can happen because i have a turret that can detect it i just dont know what code detects it

    Player Gun Code:
    Code (JavaScript):
    1. var firing : boolean = false;
    2. var accuracy : float;
    3. private var bulletCaseGenerator : Transform;
    4. private var bulletTraceGenerator : Transform;
    5. private var muzzleFlashGenerator : Transform;
    6. private var bulletCaseGeneratorScript : bulletCaseGenerator;
    7. private var bulletTraceGeneratorScript : bulletTraceGenerator;
    8. private var muzzleFlashGeneratorScript : muzzleFlashGenerator;
    9.  
    10. function Start(){
    11.     bulletCaseGenerator = transform.Find("bulletCaseGenerator");
    12.     bulletTraceGenerator = transform.Find("bulletTraceGenerator");
    13.     muzzleFlashGenerator = transform.Find("muzzleFlashGenerator");
    14.     bulletCaseGeneratorScript = bulletCaseGenerator.GetComponent("bulletCaseGenerator");
    15.     bulletTraceGeneratorScript = bulletTraceGenerator.GetComponent("bulletTraceGenerator");
    16.     muzzleFlashGeneratorScript = muzzleFlashGenerator.GetComponent("muzzleFlashGenerator");
    17.     firing = false;
    18.     //accuracy = 0.9;
    19. }
    20.  
    21. function Update () {
    22.     bulletCaseGeneratorScript.on = firing;
    23.     bulletTraceGeneratorScript.on = firing;
    24.     muzzleFlashGeneratorScript.on = firing;
    25.     bulletTraceGeneratorScript.accuracy = accuracy;
    26.     firing = false;
    27. }
    28.  
    29. function Fire(){
    30.     firing = true;
    31. }
    32.  
    33. function SetAccuracy(accuracyValue : float){
    34.     accuracy = accuracyValue;
    35. }
    Turret Code:
    Code (JavaScript):
    1. var targetRootName : String[];
    2. var explosionPrefab : GameObject;
    3. var blackSmokePrefab : GameObject;
    4. private var rotatorAngleScan : float = 35;
    5. private var rotatorAcceleration : float = 5.0;
    6. private var firing : boolean = false;
    7. private var bulletTraceGeneratorScript : bulletTraceGenerator;
    8. private var muzzleFlashGeneratorScript : muzzleFlashGenerator;
    9. private var spinningTurretScript : spinningTurret;
    10. private var base : Transform;
    11. private var rotator : Transform;
    12. private var pitch : Transform;
    13. private var barrel : Transform;
    14. private var bulletTraceGenerator : Transform;
    15. private var muzzleFlashGenerator : Transform;
    16. private var laserSight : Transform;
    17. private var laserSightScript : laserSight;
    18. private var exploded : boolean = false;;
    19. //Ai
    20. private var foundTarget : boolean;
    21. private var lastTargetfoundTime : float;
    22. private var targetBufferTime : float;
    23. private var targetTransform : Transform;
    24. private var sentryHealth : float;
    25. private var healthScript : health;
    26. var useLaserToFindTargets : boolean = true;
    27. var targetMaxDeltaAngle : float = 30;
    28. private var targets : GameObject[];
    29. //Rotator.
    30. private var rotatorSpeed : float;
    31. private var rotatorMaxSpeed : float = 60.0;
    32. private var rotatorAngleTarget : float;
    33. private var rotatorDirection : float = 1;
    34. private var rotatorChangeDirectionTime : float;
    35. private var rotatorChangeDirectionDelay: float = 1.0;
    36. //Pitch.
    37. private var pitchAngle : float;
    38. private var pitchVelocity : float;
    39. private var pitchTarget : float;
    40. private var deadPitchAngle : float = 30;
    41.  
    42. function Start(){
    43.     base = transform.Find("sentryGunBase");
    44.     rotator = base.Find("sentryGunRotator");
    45.     pitch = rotator.Find("sentryGunPitch");
    46.     barrel = pitch.Find("sentryGunBarrel");
    47.     bulletTraceGenerator = barrel.Find("bulletTraceGenerator");
    48.     muzzleFlashGenerator = barrel.Find("muzzleFlashGenerator");
    49.     spinningTurretScript = barrel.GetComponent("spinningTurret");
    50.     bulletTraceGeneratorScript = bulletTraceGenerator.GetComponent("bulletTraceGenerator");
    51.     muzzleFlashGeneratorScript = muzzleFlashGenerator.GetComponent("muzzleFlashGenerator");
    52.     laserSight = pitch.Find("laserSight");
    53.     laserSightScript = laserSight.GetComponent("laserSight");
    54.     targetBufferTime = 2.0;
    55.     healthScript = GetComponent("health");
    56. }
    57.  
    58. function Update (){
    59.     var sentryHealth = healthScript.health;
    60.     var    barrelSpeed : float = spinningTurretScript.speed;
    61.     var maxBarrelSpeed : float  = spinningTurretScript.maxSpeed;
    62.     if(barrelSpeed > maxBarrelSpeed * 0.8){
    63.         bulletTraceGeneratorScript.on = firing;
    64.         muzzleFlashGeneratorScript.on = firing;
    65.     }
    66.     else{
    67.         bulletTraceGeneratorScript.on = false;
    68.         muzzleFlashGeneratorScript.on = false;  
    69.     }
    70.     spinningTurretScript.on = firing;
    71.     if(bulletTraceGeneratorScript.on){
    72.         rigidbody.AddForceAtPosition(bulletTraceGenerator.up* Time.deltaTime * Random.value * 1900, bulletTraceGenerator.position) ;
    73.     }
    74.     if(sentryHealth <= 0 && exploded == false){//Explosion.
    75.         exploded = true;
    76.         Instantiate(explosionPrefab,pitch.position,pitch.rotation);
    77.         rigidbody.AddForce(Vector3.up*400.0);
    78.         var newBlackSmoke : GameObject = Instantiate(blackSmokePrefab,pitch.position,pitch.rotation);
    79.         newBlackSmoke.transform.parent = transform;
    80.     }
    81.     if(barrel.position.y < transform.position.y + 0.2 || sentryHealth == 0){
    82.         collider.enabled = false;
    83.         base.collider.enabled = true;
    84.         base.collider.isTrigger = false;
    85.         rotator.collider.enabled = true;
    86.         rotator.collider.isTrigger = false;
    87.         pitch.collider.enabled = true;
    88.         pitch.collider.isTrigger = false;
    89.         barrel.collider.enabled = true;
    90.         barrel.collider.isTrigger = false;
    91.         firing = false; //Deactivate if laying on the ground.
    92.         laserSightScript.on = false;
    93.         rotatorSpeed = Mathf.Lerp(rotatorSpeed,0, Time.deltaTime * rotatorAcceleration);
    94.     }
    95.     else{
    96.         sentryAI();
    97.     }
    98.     rotator.localRotation.eulerAngles.z += rotatorSpeed * Time.deltaTime;
    99.     //Pitch Angle.
    100.     if(sentryHealth > 0){ //Alive.
    101.         pitchAngle = 4.0;
    102.     }
    103.     else{
    104.         pitchTarget = deadPitchAngle; //Dead.
    105.         if(pitchAngle > pitchTarget + 1){
    106.             pitchVelocity -= 3.0 * Time.deltaTime;
    107.         }
    108.         if(pitchAngle < pitchTarget -1){
    109.             pitchVelocity += 3.0 * Time.deltaTime;
    110.         }
    111.         pitchVelocity = Mathf.Lerp(pitchVelocity,0,Time.deltaTime*5.0);
    112.         pitchAngle += pitchVelocity;
    113.     }
    114.     if(pitchAngle > deadPitchAngle){
    115.         pitchVelocity *= -1;
    116.     }
    117.     pitch.localRotation.eulerAngles.x = pitchAngle;
    118. }
    119.  
    120. function sentryAI(){
    121.     //Check for targets.
    122.     var hit : RaycastHit;
    123.     if (useLaserToFindTargets){ //This checks for targets using raycast (the laser).
    124.         if (Physics.Raycast(bulletTraceGenerator.position, bulletTraceGenerator.forward, hit)){
    125.             var isTarget : boolean = false;
    126.             for (var i = 0; i < targetRootName.Length; i++){
    127.                 if (hit.transform.root.name == targetRootName[i]){
    128.                     isTarget = true; //Check if what's ahead correspond to the target list.
    129.                 }
    130.             }
    131.             if(isTarget){
    132.                 foundTarget = true; //If what's ahead is a target.
    133.                 lastTargetfoundTime = Time.time;
    134.                 if(targetTransform == null){
    135.                     targetTransform = hit.transform; //This is the target.
    136.                 }
    137.             }
    138.         }
    139.     }
    140.     else{ //This checks for targets using a deltaAngle (Makes the turrent start shooting sooner).
    141.         targets = GetTargets();
    142.         for (var n = 0; n < targets.Length; n++){
    143.             var deltaAngle : float;
    144.             deltaAngle = Vector3.Angle(targets[n].transform.position - transform.position, -rotator.up);
    145.             Debug.DrawRay(transform.position, -rotator.up * 10.0);
    146.             if(deltaAngle < targetMaxDeltaAngle){
    147.                 foundTarget = true;
    148.                 lastTargetfoundTime = Time.time;
    149.                 targetTransform = targets[n].transform;
    150.             }
    151.         }
    152.     }
    153.     //If target has been destroyed.
    154.     if(targetTransform == null){
    155.         foundTarget = false;
    156.         firing = false;
    157.     }
    158.     //Target.
    159.     if(foundTarget){
    160.         firing = true;
    161.         var targetPositionNoHeight : Vector3 = targetTransform.position;
    162.         targetPositionNoHeight.y = rotator.position.y;
    163.         var targetDirection = targetPositionNoHeight - rotator.position;
    164.         var angleToTarget : float = Vector3.Angle(targetDirection, -rotator.up);
    165.         var targetSide : float = rotator.InverseTransformPoint(targetPositionNoHeight).x;
    166.         if(targetSide > 0){
    167.             rotatorSpeed = Mathf.Lerp(rotatorSpeed,rotatorMaxSpeed, Time.deltaTime * rotatorAcceleration);
    168.         }
    169.         else{
    170.             rotatorSpeed = Mathf.Lerp(rotatorSpeed,-rotatorMaxSpeed, Time.deltaTime * rotatorAcceleration);
    171.         }
    172.     }
    173.     //No target.
    174.     if(Time.time > lastTargetfoundTime + targetBufferTime){
    175.         foundTarget = false;
    176.         targetTransform = null;
    177.         firing = false;
    178.         var getRotatorAngle : float = rotator.localRotation.eulerAngles.z;
    179.         if (getRotatorAngle > 180){
    180.             getRotatorAngle -= 360;
    181.         }
    182.         if(rotatorDirection == 0){ //Choose new direction.
    183.             rotatorChangeDirectionTime = Time.time + rotatorChangeDirectionDelay;
    184.             if (getRotatorAngle > 0){
    185.                 rotatorDirection = -1;
    186.             }
    187.             else{
    188.                 rotatorDirection = 1;
    189.             }
    190.         }
    191.         if(Time.time < rotatorChangeDirectionTime){
    192.             rotatorSpeed = Mathf.Lerp(rotatorSpeed,0, Time.deltaTime * rotatorAcceleration);//Hold still.
    193.         }
    194.         if (rotatorDirection > 0 && Time.time > rotatorChangeDirectionTime){//Scan right.
    195.             if(getRotatorAngle > rotatorAngleScan * 0.95){
    196.                 rotatorDirection = 0;
    197.             }
    198.             rotatorSpeed = Mathf.Lerp(rotatorSpeed,rotatorMaxSpeed, Time.deltaTime * rotatorAcceleration);
    199.         }
    200.         if(rotatorDirection < 0 && Time.time > rotatorChangeDirectionTime){//Scan left.
    201.             if(getRotatorAngle < -rotatorAngleScan * 0.95){
    202.                 rotatorDirection = 0;
    203.             }
    204.             rotatorSpeed = Mathf.Lerp(rotatorSpeed,-rotatorMaxSpeed, Time.deltaTime * rotatorAcceleration);          
    205.         }
    206.     }
    207.     else{
    208.         rotatorSpeed = Mathf.Lerp(rotatorSpeed,0, Time.deltaTime * rotatorAcceleration);
    209.     }  
    210. }
    211.  
    212. function GetTargets() : GameObject[]{
    213.     var returnList = new GameObject[targetRootName.Length];
    214.     for (var i = 0; i < targetRootName.Length; i++){
    215.         returnList[i] = GameObject.Find(targetRootName[i]);
    216.     }
    217.     return returnList;
    218. }
    I don't want to fix the turret i just want a script that i add to any object to make take collision when i had just a cube with rigidbody and it worked fine but this enemy seems a little different
     
  2. Nanako

    Nanako

    Joined:
    Sep 24, 2014
    Posts:
    1,047
    in order for collisions to work, both objects need to have a collider, and i think at least one of them has to have a rigidbody too. this is probably an issue of your component setup
     
  3. Nubz

    Nubz

    Joined:
    Sep 22, 2012
    Posts:
    553
    rigidbody or character controller on at least one of them.
     
  4. camlam999

    camlam999

    Joined:
    Aug 8, 2014
    Posts:
    29
    thank god people actually reply on this :D ive been waiting for weeks on help for this stuff
     
  5. Nanako

    Nanako

    Joined:
    Sep 24, 2014
    Posts:
    1,047
    i know, it's sad. This particular subforum doesnt seem to be getting much attention ;-;

    Right now i'm just combing through it helping with everything that my knowledge is capable of (which sadly isn't much)
     
  6. camlam999

    camlam999

    Joined:
    Aug 8, 2014
    Posts:
    29
    well you try :) i see most my post have many hundreds of views but its just people looking for answers
     
  7. Nanako

    Nanako

    Joined:
    Sep 24, 2014
    Posts:
    1,047
    have you solved this issue yet?

    try posting more info since there isn't really enough here to help yo. screenshots of the component setup for the objects involved would be good
     
    skusku likes this.
  8. camlam999

    camlam999

    Joined:
    Aug 8, 2014
    Posts:
    29