使用Unity中的光线投影修改AI脚本

时间:2013-03-18 17:00:28

标签: unity3d unityscript raycasting

所以我设法修改了我为光线投射找到的一些代码,以便我的敌人朝着我第一人称相机的坐标移动。但是,我需要改变射线投射方式将敌人绕过我场景中的障碍物。我对myTransform / transform / target变量感到有些困惑。

所以这是我的代码;

var speed : float = 10.0;
private var dir : Vector3;
private var dirFull : Vector3;
var target : Transform;
var rotationSpeed = 3;

var myTransform : Transform;

function Awake()
{
  myTransform = transform;
}


function Start()
{
  target = GameObject.FindGameObjectWithTag("Player").transform; //Target the player
}

function FixedUpdate()
{ 
  // the directional vector to the target
  dir = (target - transform.position).normalized;
  var hit : RaycastHit;

  // more raycasts   
  var leftRay = transform.position + Vector3(-0.125, 0, 0);
  var rightRay = transform.position + Vector3(0.125, 0, 0);


  // check for forward raycast
  if (Physics.Raycast(transform.position, transform.forward, hit, 5)) /
  {
     if (hit.transform != this.transform)
     {
       Debug.DrawLine (transform.position, hit.point, Color.white);

       dir += hit.normal * 20; // 20 is force to repel by
     }
  }


  // check for leftRay raycast
  if (Physics.Raycast(leftRay, transform.forward, hit, 5)) 
  {
     if (hit.transform != this.transform)
     {
       Debug.DrawLine (leftRay, hit.point, Color.red);

       dir += hit.normal * 20; // 20 is force to repel by
     }
  }


  // check for rightRay raycast
  if (Physics.Raycast(rightRay, transform.forward, hit, 5)) 
  {
     if (hit.transform != this.transform)
     {
       Debug.DrawLine (rightRay, hit.point, Color.green);

       dir += hit.normal * 20; // 20 is force to repel by
     }
  }

   // rotation
var rot = Quaternion.LookRotation (dir);

transform.rotation = Quaternion.Slerp (transform.rotation, rot, Time.deltaTime);

//position
transform.position += transform.forward * (2 * Time.deltaTime); // 20 is speed
}

我几乎可以肯定,我需要更改的唯一想法是dir变量,以便它使用新的转换代码。但正如我所说,我一直对使用哪个变量感到困惑。

编辑:我的理解是我需要更改更新底部的代码,以便考虑通过光线投射遇到障碍时发生的旋转。这就是为什么我认为它只是需要改变然后在位置和旋转代码中使用的“dir”和“rot”。

2 个答案:

答案 0 :(得分:0)

大部分FixedUpdate()函数用于计算dir值。但是,最后有评论说代码正在更新位置,但它们不使用计算的dir值。我无法测试这个,但似乎你需要改变你的最后一行:

transform.position += dir * (2 * Time.deltaTime);

目前看来,此代码忽略了敌人或玩家的任何位置:

transform.position += transform.forward * (2 * Time.deltaTime); // 20 is speed

它只是试图将敌人“向前”移动,这被定义为(在Unity documentation中)为“世界空间变换的蓝轴。”

如果你有代码以dir的方向旋转敌人,你似乎需要向这个方向移动敌人。

答案 1 :(得分:0)

所有我必须改变以使其工作的是代码行;

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

为...

dir = target.position - myTransform.position; 

所以当我猜测是需要改变的dir变量时,我是对的。