【问题标题】:Modifying an AI script with raycasting in Unity在 Unity 中使用光线投射修改 AI 脚本
【发布时间】:2013-03-07 03:02:57
【问题描述】:

所以我设法修改了一些我找到的用于光线投射的代码,以便我的敌人向我的第一人称相机的坐标移动。但是,我需要改变光线投射在场景中的障碍物周围移动敌人的方式。我对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”需要更改,然后在位置和旋转代码中使用。

【问题讨论】:

  • 我假设这个脚本是附加在敌人身上的,而不是玩家身上。对吗?
  • 是的,它附着在敌人身上。
  • 我刚刚制定了解决方案。在允许的情况下将其作为答案发布(我必须等待 8 小时才能发布我自己问题的答案)。
  • 很高兴你让它工作了;抱歉,我帮不上忙。
  • 我猜你是用 Unity3d 做的,而不是 Unity Container?我正在重新标记问题。

标签: unity3d unityscript raycasting


【解决方案1】:

大部分FixedUpdate() 函数用于计算您的dir 值。但是,最后有 cmets 说代码正在更新位置,但他们不使用计算出的 dir 值。我无法对此进行测试,但您似乎需要将最后一行更改为:

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

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

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

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

如果你有代码让敌人朝dir 的方向旋转,你似乎需要将敌人朝那个方向移动。

【讨论】:

  • 别以为是这个。移动/旋转代码工作正常。是当敌人遇到需要改变“dir += hit.normal * 20”的障碍物时改变敌人位置的代码
  • 那么dir在哪里使用?您的光线投射代码仅修改 dir。如果您从不使用 dir,那么您使用 what 代码设置 dir 的值并不重要。
  • 另外,如果您说绕过障碍物的代码不起作用,您怎么能说“移动/旋转代码工作正常”?
  • 我只是把代码改成了原来的样子(在我开始弄乱它之前)。您现在可以在 Update 函数的底部看到正在使用 dir。我所说的移动/旋转工作的意思是,如果我可能的话,敌人确实会朝着第一人称相机移动并朝它旋转。现在因为我已将代码改回原来的样子,但由于转换冲突,它已损坏。
  • 刚刚看到您的编辑,我知道在不考虑障碍物所需的旋转时如何修改位置/旋转代码。我可以很好地让敌人跟随我。这是我的问题发生的地方,我不知道如何修改光线投射代码,以便在关注我时考虑到它。
【解决方案2】:

我必须改变的只是代码行;

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

到...

dir = target.position - myTransform.position; 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多