I want to give the Damage from enemy`s bullet script to Player Health, but it showed me this error :> Assets/Tactical Shooter AI/Tactical AI/Csharp/Damage Scripts/BulletScript.cs(15,3): error CS0246: The type or namespace name `HealthingScript' could not be found. Are you missing an assembly reference?
Here is my Enemy`s bullet script the problem is in IEnumertor ApplyDamage method :
using UnityEngine;
using System.Collections;
/*
* Moves an object until it hits a target, at which time it calls the Damage(float) method on all scripts on the hit object
* Can also home in on targets and "detonate" when in close proximity.
* */
namespace TacticalAI
{
public class BulletScript : MonoBehaviour
{
public string damageMethodName = "Damage";
HealthingScript hs;
public float speed = 1000;
public LayerMask layerMask;
public float maxLifeTime = 3;
//Bullet Stuff
public float damage = 16;
//use for shotguns
public float bulletForce = 100;
public int points = 12;
//Hit Effects
public GameObject hitEffect;
public float hitEffectDestroyTime = 1;
public string hitEffectTag = "HitBox";
public GameObject missEffect;
public float missEffectDestroyTime = 1;
public float timeToDestroyAfterHitting = 0.5f;
private RaycastHit hit;
private Transform myTransform;
//Rotation
private Quaternion targetRotation;
private Transform target = null;
public float homingTrackingSpeed = 3;
public float minDistToDetonate = 0.5f;
private float minDistToDetonateSqr;
public string friendlyTag;
void Awake()
{
myTransform = transform;
Move();
StartCoroutine(SetTimeToDestroy());
}
//Automatically destroy the bullet after a certain amount of time
//Especially useful for missiles, which may end up flying endless circles around their target,
//long after the appropriate sound effects have ended.
IEnumerator SetTimeToDestroy()
{
yield return new WaitForSeconds(maxLifeTime);
if (target)
{
Instantiate(hitEffect, myTransform.position, myTransform.rotation);
}
Destroy(gameObject);
}
IEnumerator ApplyDamage()
{
//Reduce the enemy's health
//Does NOT travel up the heirarchy.
if (hit.collider.tag == "Player") {
hit.collider.SendMessage ("PlayerDamage", damage, SendMessageOptions.DontRequireReceiver);
}
//Produce the appropriate special effect
if (hit.transform.tag == hitEffectTag && hitEffect)
{
GameObject currentHitEffect = (GameObject)(Instantiate(hitEffect, hit.point, myTransform.rotation));
GameObject.Destroy(currentHitEffect, hitEffectDestroyTime);
}
else if (missEffect)
{
GameObject currentMissEffect = (GameObject)(Instantiate(missEffect, hit.point + hit.normal * 0.01f, Quaternion.LookRotation(hit.normal)));
GameObject.Destroy(currentMissEffect, missEffectDestroyTime);
}
this.enabled = false;
yield return null;
//Wait a fram to apply forces as we need to make sure the thing is dead
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(myTransform.forward * bulletForce, hit.point, ForceMode.Impulse);
//Linger around for a while to let the trail renderer dissipate (if the bullet has one.)
Destroy(gameObject, timeToDestroyAfterHitting);
}
// Update is called once per frame
void Update()
{
Move();
}
//Move is a seperate method as the bullet must move IMMEDIATELY.
//If it does not, the shooter may literally outrun the bullet-momentarily.
//If the shooter passes the bullet, the bullet will then start moving and hit the shooter in the back.
//That would not be good.
void Move()
{
//Check to see if we're going to hit anything. If so, move right to it and deal damage
if (Physics.Raycast(myTransform.position, myTransform.forward, out hit, speed * Time.deltaTime, layerMask.value))
{
myTransform.position = hit.point;
StartCoroutine(ApplyDamage());
}
else
{
//Move the bullet forwards
transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
//Home in on the target
if (target != null)
{
//Firgure out the rotation required to move directly towards the target
targetRotation = Quaternion.LookRotation(target.position - transform.position);
//Smoothly rotate to face the target over several frames. The slower the rotation, the easier it is to dodg.
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, homingTrackingSpeed * Time.deltaTime);
Debug.DrawRay(transform.position, (target.position - transform.position).normalized * minDistToDetonate,Color.red);
//Projectile will "detonate" upon getting close enough to the target..
if (Vector3.SqrMagnitude(target.position - transform.position) < minDistToDetonateSqr)
{
//The hitEffect should be your explosion.
Instantiate(hitEffect, myTransform.position, myTransform.rotation);
GameObject.Destroy(gameObject);
}
}
}
//To avoid costly SqrRoot in Vector3.Distance
public void SetDistToDetonate(float x)
{
minDistToDetonateSqr = x * x;
}
//Call this method upon instantating the bullet in order to make it home in on a target.
public void SetAsHoming(Transform t)
{
target = t;
SetDistToDetonate(minDistToDetonate);
}
}
}
Here is my PlayerHealth code the name of my player script is HealthingScript
COde is :
#pragma strict
var hitPoints : float;
var maxHitPoints : int;
var regeneration : boolean = false;
var regenerationSpeed : float;
var aSource : AudioSource;
var painSound : AudioClip;
var fallDamageSound : AudioClip;
var deadReplacement : Transform;
var mySkin : GUISkin;
private var radar : GameObject;
var damageTexture : Texture;
private var t : float = 0.0;
private var alpha : float;
private var isDead : boolean = false;
private var scoreManager : ScoreManager;
var camShake : Transform;
function Start(){
if(regeneration)
hitPoints = maxHitPoints;
alpha = 0.0;
}
function Update(){
if (t > 0.0){
t -= Time.deltaTime;
alpha = t;
}
if(regeneration){
if( hitPoints < maxHitPoints)
hitPoints += Time.deltaTime * regenerationSpeed;
}
}
public function PlayerDamage (damage : int) {
if (hitPoints < 0.0) return;
hitPoints -= damage;
aSource.PlayOneShot(painSound, 1.0);
t = 2.0;
if (hitPoints <= 0.0) Die();
}
//Picking up MedicKit
function Medic (medic : int){
hitPoints += medic;
if( hitPoints > maxHitPoints){
var convertToScore : float = hitPoints - maxHitPoints;
scoreManager = gameObject.Find("ScoreManager").GetComponent(ScoreManager);
scoreManager.addScore(convertToScore);
hitPoints = maxHitPoints;
}
}
function Die () {
if(isDead) return;
isDead = true;
if(scoreManager == null)
scoreManager = gameObject.Find("ScoreManager").GetComponent(ScoreManager);
scoreManager.PlayerDead();
Instantiate(deadReplacement, transform.position, transform.rotation);
Destroy(gameObject);
}
function OnGUI () {
GUI.skin = mySkin;
GUI.Label (Rect(40, Screen.height - 50,60,60)," Health: ");
GUI.Label (Rect(100, Screen.height - 50,60,60),"" +hitPoints.ToString("F0"), mySkin.customStyles[0]);
GUI.color.a = alpha;
GUI.DrawTexture(new Rect(0,0,Screen.width, Screen.height), damageTexture);
}
function PlayerFallDamage(dam : float){
PlayerDamage(dam);
if(fallDamageSound) aSource.PlayOneShot(fallDamageSound, 1.0);
}
function Shake(p : float) {
var t : float = 1.0;
var shakePower : float;
while (t > 0.0) {
t -= Time.deltaTime;
shakePower = t/50;
camShake.rotation.x += Random.Range(-shakePower, shakePower);
camShake.rotation.y += Random.Range(-shakePower, shakePower);
camShake.rotation.z += Random.Range(-shakePower, shakePower);
yield;
}
}
I am not a noob but I don`t know why I can`t able to do this
Any comment and solution is appreciated here!
Thanks!
↧