List.Contains在Unity C#中不起作用

时间:2015-05-05 15:57:39

标签: c# list unity3d contains

我正在开展一个平面上存在玩家角色,球体和圆柱体的项目。

它应该起作用的方式是角色检测球体并且可以拾取球体。通过将球体的名称发送到列表然后销毁该对象。然后,当角色与框交互时,使用Sphere检查姓名(在这种情况下为inventory.Contains("Sphere")),如果密钥在广告资源中,则会解锁'但无论球体是否在库存中,都会锁定该框。

以下是代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class RayCasting : MonoBehaviour 
{
   float  rayCoeff;
   RaycastHit hit;
   List<string> inventory = new List<string>();

   // Use this for initialization
   void Start () 
   {
      rayCoeff = 3f;
   }

void Cast()
{
    Debug.DrawRay (transform.position, Vector3.right * rayCoeff, Color.red);
    Debug.DrawRay (transform.position, Vector3.right * -rayCoeff, Color.red);
    Debug.DrawRay (transform.position, Vector3.forward * rayCoeff, Color.red);
    Debug.DrawRay (transform.position, Vector3.forward * -rayCoeff, Color.red);

    if (Physics.Raycast (transform.position, Vector3.forward, out hit, rayCoeff, 1<<8)) {
        if(hit.collider.tag == "Interactable") {
            //Debug.Log ("Front Scan with collider!, Found Thing.");
            if(Input.GetKey(KeyCode.E)) {
                string inventoryClaim = hit.collider.ToString();
                inventory.Add(inventoryClaim);
                Destroy(hit.collider.gameObject);

            }
        }
    } 
    else if (Physics.Raycast (transform.position, new Vector3(0, 0, -1), out hit, rayCoeff, 1<<8)) {
        if(hit.collider.tag == "Interactable") {
            //Debug.Log ("Back Scan with collider!, Found Thing.");
            if(Input.GetKey(KeyCode.E)) {
                string inventoryClaim = hit.collider.ToString();
                inventory.Add(inventoryClaim);
                Destroy(hit.collider.gameObject);

            }
        }
    }
    else if (Physics.Raycast (transform.position, Vector3.right, out hit, rayCoeff, 1<<8)) {
        if(hit.collider.tag == "Interactable") {
            //Debug.Log ("Right Scan with collider!, Found Thing.");
            if(Input.GetKey(KeyCode.E)) {
                string inventoryClaim = hit.collider.ToString();
                inventory.Add(inventoryClaim);
                Destroy(hit.collider.gameObject);

            }
        }
    }
    else if (Physics.Raycast (transform.position, new Vector3(-1, 0, 0), out hit, rayCoeff, 1<<8)) {
        if(hit.collider.tag == "Interactable") {
            //Debug.Log ("Left Scan with collider!, Found Thing.");
            if(Input.GetKey(KeyCode.E)) {
                string inventoryClaim = hit.collider.ToString();
                inventory.Add(inventoryClaim);
                Destroy(hit.collider.gameObject);

            }
        }
        else if (hit.collider.tag == "Cylinder"){
            if(Input.GetKey(KeyCode.E)) {
                if(inventory.Contains("Sphere")) {
                    Debug.Log("Hooray!");
                }
            }
        }
    }
}



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

没有错误,只是缺乏认可。

1 个答案:

答案 0 :(得分:1)

扩展Vlad的评论...调用hit.collider.ToString()将返回类似&#34; Sphere(UnityEngine.SphereCollider)&#34; - 对撞机的某种字符串ID,表示这是一个坐在称为Sphere的游戏对象上的球体对撞机。
因此,如果您想要命中对撞机所在的游戏对象的名称,您可以编写

string inventoryClaim = hit.collider.name;

变量&#34; name&#34;将引用组件(在本例中为对撞机)所在的游戏对象的名称。