检测光标的更好方法是什么?

时间:2018-04-04 10:18:31

标签: c# unity3d

目标:检测光标何时进入播放器的定义半径。

您好,我正在尝试从名为CrossCode的游戏中复制战斗系统。这个想法是当光标在玩家的某个半径范围内时,我将能够切换到近战格斗,并在光标离开这个半径后返回到远程。

我已经实现了一种我认为可以完成的方式,但是它感觉很慢或不可靠而且我只是想知道是否还有其他任何方法我可以研究以获得更平滑的结果。

以下是我所做的

附加到播放器

void Update()
{
    attackStyleSwitchRadius = colRef.radius;
    playerCenter = colRef.transform.position;

    if(Physics2D.OverlapCircle(playerCenter, attackStyleSwitchRadius, cursor))
    {
        meleeMode = true;
        rangeMode = false;
    }
    else
    {
        meleeMode = false;
        rangeMode = true;
    }

}

在一个小的2D对象上,我有这个脚本,以便它跟随光标位置。

void Update()
{
    pos = Input.mousePosition;
    gameObject.transform.position = Camera.main.ScreenToWorldPoint(pos);
}

当小物体进入重叠圆圈时,它会改变周围的bools。

2 个答案:

答案 0 :(得分:3)

您可以通过执行此类操作来删除碰撞检测开销;

void Update ()
{
    attackStyleSwitchRadius = colRef.radius;
    playerCenter = colRef.transform.position;

    var mouse = Input.mousePosition;
    mouse.z = Vector3.Distance(Camera.main.transform.position, playerCenter);

    var range = Vector2.Distance(Camera.main.ScreenToWorldPoint(mouse), playerCenter);    
    var inside = range < attackStyleSwitchRadius;

    meleeMode = inside;
    rangeMode = !inside;
}

答案 1 :(得分:2)

<强>光标

  1. 制作一个物体,将其命名为光标。
  2. 向游标对象添加一个小对撞机。
  3. 向游标对象添加一个脚本,使其始终位于鼠标位置。
  4. 近战范围

    1. 将GameObject添加为玩家的子级,将其命名为MeleeRangeZone。
    2. 为其添加一个对撞机,将其设置为触发器。这个对手的大小将是玩家的近战范围,
    3. 为其添加刚体,以便可以检测到碰撞,但将刚体设置为不旋转或更改其位置。
    4. 向对象添加脚本,并使用OnTriggerEnter和OnTriggerExit方法检测光标是否已进入近战区域。
    5. 现在可以使用OnTriggerEnter和OnTriggerExit方法在玩家攻击模式之间切换,这意味着当光标进入时它变为近战,当它退出时它会变为范围。

      您可以触发光线以检测光标应具有的位置,如下所示:

      public LayerMask RaycastCollidableLayers;
      public RaycastHit Hit;
      public float CheckDistance = 200f;
      public Transform Cursor;
      
      void PerformRaycast(){
      //Set up ray
      ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      //Fire ray
      Physics.Raycast(ray, out Hit, CheckDistance + 0.1f, RaycastCollidableLayers);
      if (Hit.collider == null)
      {
          //Debug.Log("Raycast hit nothing");
          return;
      }
      else //Ray hit something
          {
          //Move cursor to Hit.point;
          Cursor.position = Hit.point;
          }
      }