AI感官模拟

</pre><pre code_snippet_id="1607703" snippet_file_name="blog_20160312_2_2743111" name="code" class="csharp">//父类
//方便添加新感官
using UnityEngine;
using System.Collections;

/// <summary>
/// AI感官类
/// </summary>
public class Sense : MonoBehaviour {
    public bool isDebug = true;
    public Aspect.aspect aspectName = Aspect.aspect.Enemy;
    public float detectionRote = 1.0f;

    protected float elapsedTime = 0.0f;
    //初始化感官
    protected virtual void Initialise() { }
    //更新感官
    protected virtual void UpdateSense() { }

    void Start()
    {
        elapsedTime = 0.0f;
        Initialise();
    }

    void Update()
    {
        UpdateSense();
    }

}
</pre><pre code_snippet_id="1607703" snippet_file_name="blog_20160312_11_8725111" name="code" class="csharp">
</pre><pre code_snippet_id="1607703" snippet_file_name="blog_20160312_8_1896341" name="code" class="csharp">//视觉感官实例化类
using UnityEngine;
using System.Collections;


public class Perspective : Sense  {
    public int FieldOfView = 45;//检测范围
    public int ViewDistance = 100;//检测距离


    private Transform playerTrans;
    private Vector3 rayDirection;


    /// <summary>
    /// 发现player坐标
    /// </summary>
    protected override void Initialise()
    {
        playerTrans = GameObject.FindGameObjectWithTag("Player").transform;
    }




    protected override void UpdateSense()
    {
        elapsedTime += Time.deltaTime;
        //检测需要感觉的范围内是否存在物体
        if (elapsedTime >= detectionRote)
            DetectAspect();
    }




    /// <summary>
    /// 感觉范围内是否有物体
    /// </summary>
    private void DetectAspect()
    {
        RaycastHit hit;
        //当前位置与player的位置的距离
        rayDirection = playerTrans.position - this.transform.position;


        //计算当前位置与players的位置是否在检测范围内
        if ((Vector3.Angle(rayDirection, this.transform.position)) < FieldOfView)
        {
            //如果player在检测范围内
            if (Physics.Raycast(this.transform.position, rayDirection, out hit, ViewDistance))
            {
                Aspect aspect = hit.collider.GetComponent<Aspect>();
                if (aspect != null)
                {
                    //更新朝向
                    if (aspect.aspectName == aspectName)
                    {
                        //输出检测到敌人
                        print("Enemy Detected");
                    }
                }
            }
        }
    }


    void OnDrawGizoms()
    {
        if (!isDebug || playerTrans == null)
            return;


        Debug.DrawLine(transform.position, playerTrans.position, Color.red);


        Vector3 frontRayPoint = transform.position + (transform.position * ViewDistance);


        //在编译状态可视化
        Vector3 leftRayPoint = frontRayPoint;
        leftRayPoint.x += FieldOfView * 0.5f;


        Vector3 rightRayPoint = frontRayPoint;
        rightRayPoint.x -= FieldOfView * 0.5f;


        Debug.DrawLine(transform.position, frontRayPoint, Color.green);
        Debug.DrawLine(transform.position, leftRayPoint, Color.green);
        Debug.DrawLine(transform.position, rightRayPoint, Color.green);
    }
}
 
 
 
 
//作为实例化的触摸类
using UnityEngine;
using System.Collections;


public class Touch : Sense  {
    void OnTriggerEnter(Collider other)
    {
        Aspect aspect = other.GetComponent<Aspect>();
        if (aspect != null)
        {
            if (aspect.aspectName == aspectName)
            {
                print("Enemy Touch Detected");
            }
        }
    }
}
 
 
</pre><pre code_snippet_id="1607703" snippet_file_name="blog_20160312_11_8725111" name="code" class="csharp">

你可能感兴趣的:(C#,人工智能,unity3d,AI)