在Unity中使用光线投射修改AI脚本



所以我已经设法修改了一些代码,我已经找到了光线投射,使我的敌人移动到我的第一人称摄像机的坐标。然而,我需要改变光线投射让敌人绕过场景中的障碍物的方式。我对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"one_answers"rot"需要改变,然后在位置和旋转代码中使用。

大部分FixedUpdate()函数用于计算dir值。然而,最后有注释说代码正在更新位置,但它们不使用计算的dir值。我无法测试这一点,但似乎您需要将最后一行更改为:

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

当前,这段代码忽略了敌人或玩家的任何位置:

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

它只是试图将敌人"向前"移动,这被定义为(在Unity文档中)"在世界空间中转换的蓝色轴"。

如果你有代码让敌人在dir的方向上旋转,看起来你需要在那个方向上移动敌人。

我所要做的就是修改这行代码;

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

……

dir = target.position - myTransform.position; 

最新更新