插件推荐Unity技术分享AI

BehaviorDesigner 实现NPC 智能机器人

2017-05-01  本文已影响140人  miccall

BehaviorDesigner 实现NPC 智能机器人

Created by miccall (转载请注明出处 miccall.tech)

实现物体跟随摄像机视野运动

1. VR实现机器人导航

2. 问题思考

 - 1. 物体移动到某个给定的位置(target)
 - 2. 物体转动到面向摄像机 
 - 3. 出现在相机的视野当中 
 - 4. 自定义物体在摄影机的Screen中的位置 

3.实现以及方法

        void LookTransform(Transform Mtransform)
            {
                Vector3 tarPos = Mtransform.position;
                Vector3 dirRot = tarPos - transform.position;
                Quaternion tarRot = Quaternion.LookRotation(dirRot);
                transform.rotation = Quaternion.Slerp(transform.rotation, tarRot, rotSpeed * Time.deltaTime);
            }

          transform.Translate(new Vector3(0, 0, movementSpeed * Time.deltaTime));
        Vector3.Distance(transform.position, followTransform.position);

        //该物体 接近要  到达的目标   指定位置后就停止  
        if (Vector3.Distance(transform.position, followTransform.position) < 3f)
        {
            //当物体道到位置时 让物体面 向摄像机 
            LookTransform(Camre);
            return;
        }
        else
        {
            //让物体转向 将要运动 的方向 
            LookTransform(followTransform);
            transform.Translate(new Vector3(0, 0, movementSpeed * Time.deltaTime));
        }
这里写图片描述
      Vector3[] GetCorners(float distance)
          {
        Vector3[] corners = new Vector3[4];

        float halfFOV = (theCamera.fieldOfView * 0.5f) * Mathf.Deg2Rad;
        float aspect = theCamera.aspect;

        float height = distance * Mathf.Tan(halfFOV);
        float width = height * aspect;

        // UpperLeft
        corners[0] = tx.position - (tx.right * width);
        corners[0] += tx.up * height;
        corners[0] += tx.forward * distance;

        // UpperRight
        corners[1] = tx.position + (tx.right * width);
        corners[1] += tx.up * height;
        corners[1] += tx.forward * distance;

        // LowerLeft
        corners[2] = tx.position - (tx.right * width);
        corners[2] -= tx.up * height;
        corners[2] += tx.forward * distance;

        // LowerRight
        corners[3] = tx.position + (tx.right * width);
        corners[3] -= tx.up * height;
        corners[3] += tx.forward * distance;

        return corners;
    }
      void FindUpperCorners()
      {
        Vector3[] corners = GetCorners(upperDistance);
        // for debugging
        Debug.DrawLine(corners[0], corners[1], Color.yellow); // UpperLeft -> UpperRight
        Debug.DrawLine(corners[1], corners[3], Color.yellow); // UpperRight -> LowerRight
        Debug.DrawLine(corners[3], corners[2], Color.yellow); // LowerRight -> LowerLeft
        Debug.DrawLine(corners[2], corners[0], Color.yellow); // LowerLeft -> UpperLeft
}
        void OnDrawGizmosSelected()
        {
            Vector3 p = theCamera.ScreenToWorldPoint(new Vector3(100, 200, 8));
            Gizmos.color = Color.blue;
            //target.position = p;
            Gizmos.DrawSphere(p, 1F);
        }
          void maketarget()
          {
              Vector3 p = theCamera.ScreenToWorldPoint(new Vector3(RH, RV, upperDistance));
              target.position = p;
          }

4.中途出现的小BUG

BehaviorDesigner 介绍以及使用方法

基本任务

1.判断是否到达目的地

        using UnityEngine;

        namespace BehaviorDesigner.Runtime.Tasks.Basic.UnityVector3
        {
            [TaskCategory("Basic/Vector3")]
            [TaskDescription("Returns the distance between two Vector3s.")]

            public class dis_tance : Action
            {

                [Tooltip("target Vector3")]
                public SharedVector3 firstVector3;
                [Tooltip("The distance")]
                [RequiredField]
                public SharedFloat storeResult;
                public SharedGameObject action;
                //看代码就应该看到 我们需要一个target的位置向量 一个action的GameObject 
                //还有一个距离的返回值 


                public override TaskStatus OnUpdate()
                {
                    storeResult.Value = Vector3.Distance(firstVector3.Value, action.Value.transform.position);
                    return TaskStatus.Success;
                }

                public override void OnReset()
                {
                    storeResult = 0;
                }
            }
        }
        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        namespace BehaviorDesigner.Runtime.Tasks.Basic.UnityVector3 { 
            public class comparedis : Action {

                public SharedFloat distance;
                public SharedFloat compare_dis ;
                /*compare_dis 表示一个范围 以distance 减去这个范围 
                表示以target为圆心 画一个compare_dis的球 只要进入这个球 ,说明已经到达目的地  */
                public SharedBool storeResult;
                /*我们返回一个bool值 他的意思是机器人是否静止 
                  如果和target的计算距离大于0 那么就不是禁止 他就应该移动到target 否则 他是静止的,就应该做相应的动画 
                */
                public override TaskStatus OnUpdate()
                {
                    storeResult.Value = distance.Value - compare_dis.Value > 0 ? false : true ; 
                    return TaskStatus.Success;
                }

                public override void OnReset()
                {
                    
                }
            }
        }

2.移动到target

move

-looktarget前面也讲过了 movetotarget是封装以后的translate 可以自己动脑去实现一下

3.停止逻辑

stop

4.第一次停止动画

firststop

5.面向摄像机

lookcam

6.面向UI

lookUI

7.面向UI之后的动作

UIaction
上一篇 下一篇

猜你喜欢

热点阅读