Physics.RaycastAll查找带有标签的敌人

时间:2012-12-15 23:51:51

标签: c# unity3d

我是团结的新手,我正在尝试做的是创建一个光线投射,找到所有标记为敌人的物体,这些物体位于我的播放器前面,当我按下F键时它们在那个区域他们每个人都有一些健康,有人可以帮助我吗?这是我的代码:

using UnityEngine;
using System.Collections;

public class meleeAttack : MonoBehaviour {
public GameObject target;
public float attackTimer;
public float coolDown;

private RaycastHit hit;


// Use this for initialization
void Start () {
    attackTimer = 0;
    coolDown = 0.5f;

}

// Update is called once per frame
void Update () {


    if(attackTimer > 0)
        attackTimer -= Time.deltaTime;

    if(attackTimer < 0)
        attackTimer = 0;

    if (Input.GetKeyUp(KeyCode.F)) {
        if(attackTimer == 0)
        Attack();
        attackTimer = coolDown;
    }
}

private void Attack() {



    float distance = Vector3.Distance(target.transform.position, transform.position);

    Vector3 dir = (target.transform.position - transform.position).normalized;

    float direction = Vector3.Dot(dir, transform.forward);

    Debug.Log(direction);
    if (distance < 3 && direction > 0.5) {
        enemyhealth eh = (enemyhealth)target.GetComponent("enemyhealth");
        eh.AddjustCurrentHealth(-10);
    }
}
}

using UnityEngine;
using System.Collections;

public class enemyhealth : MonoBehaviour {

public int maxHealth = 100;
public int currentHealth = 100;


public float healthBarLength;
// Use this for initialization
void Start () {
    healthBarLength = Screen.width / 2;
}

// Update is called once per frame
void Update () {
    AddjustCurrentHealth(0);
}

void OnGUI() {
    GUI.Box(new Rect(10, 40, healthBarLength, 20), currentHealth + "/" + maxHealth);
}

public void AddjustCurrentHealth(int adj){
    currentHealth += adj;
    if (currentHealth < 0)
        currentHealth = 0;

    if (currentHealth > maxHealth)
        currentHealth = maxHealth;

    if (maxHealth < 1)
        maxHealth = 1;

    healthBarLength = (Screen.width / 2) * (currentHealth / (float)maxHealth);
}
}

1 个答案:

答案 0 :(得分:0)

private void Attack(){
    int user_defined_layer = 8;  //use the 'User Layer' you created to define NPCs
    int layer_mask = 1 << user_defined_layer; 

    RaycastHit[] hits;

    // Get direction in front of your player
    Vector3 direction = transform.TransformPoint( Vector3.forward );
    hits = Physics.RaycastAll(transform.position, direction, Mathf.Infinity, layer_mask)

    foreach(RaycastHit hit in hits)
    {
        //NPC is hit, decrease his/her/its life
    }
}

最好不要尝试从你的位置到NPC的方向。让Unity的光线投射引擎为您处理ray-NPC相交测试。这种方法确实需要你的NPC有一个Collider。