目标:检测光标何时进入播放器的定义半径。
您好,我正在尝试从名为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。
答案 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)
<强>光标强>
近战范围
现在可以使用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;
}
}