本文共 3231 字,大约阅读时间需要 10 分钟。
在Unity开发中,如果想实现类似于红警或魔兽等经典游戏中的鼠标控制效果,可以通过以下方法进行优化。这种方法主要适用于一个物体被多个AI或玩家同时控制的情形,例如游军系统。
我们可以分为两部分来分析这个问题:
public class AI : MonoBehaviour{ public bool CanMove = false; // 是否可以接受控制,默认为false public Vector3 Pos; // 位置(在另一个脚本中会被赋值) private void Update() { if (CanMove) { Move(Pos); } } private void Move(Vector3 TargetPos) { Pos.y = transform.position.y; // 保持在同一平面上 if (Vector3.Distance(transform.position, TargetPos) > 0.1f) { transform.LookAt(TargetPos); // 动态调整方向 transform.Translate(Vector3.forward * Time.deltaTime * 3); // 开始移动 } }} 这个脚本主要负责接收目标位置并移动物体。需要注意的是这里的Pos变量需要在另一个脚本中被赋值。
public class MouseControl : MonoBehaviour { private Vector3 FirstPos; // 鼓按下后的初始位置 private Vector3 SecondPos; // 鼓抬起后的最终位置 private Vector3 CurrentPos; // 当前被控制的物体位置 private Vector3 TempPos; // 临时存储目标位置 public List Targets; // 目标物体列表 private void Start() { Targets = new List (); } private void Update() { GetObject(); // 检查目标物体 if (Input.GetMouseButtonDown(0)) { // 左按键按下 CurrentPos = Camera.main.ScreenToWorldPoint(new Vector3( Input.mousePosition.x, Input.mousePosition.y, 10 )); FirstPos = CurrentPos; // 记录初始位置 } if (Input.GetMouseButton(0)) { // 按住左按键 CurrentPos = Camera.main.ScreenToWorldPoint(new Vector3( Input.mousePosition.x, Input.mousePosition.y, 10 )); SecondPos = CurrentPos; // 记录最终位置 } if (Input.GetMouseButton(1)) { // 右按键按下 if (Targets.Count > 0) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { TempPos = hit.point; foreach (var target in Targets) { if (!list.Contains(target.gameObject)) { target.GetComponent ().CanMove = true; target.GetComponent ().Pos = TempPos; } } } } } } private void GetObject() { Vector3 Center = (FirstPos + SecondPos) / 2; Collider[] colliders = Physics.OverlapBox( Center, new Vector3( Mathf.Abs(FirstPos.x - SecondPos.x), Mathf.Abs(FirstPos.x - SecondPos.x), Mathf.Abs(FirstPos.z - SecondPos.z) ) ); foreach (var obj in colliders) { if (obj.CompareTag("Player") && !Targets.Contains(obj.gameObject)) { Targets.Add(obj.gameObject); } } }} 在这个脚本中,我们主要完成了以下几个步骤:
这个控制逻辑可以根据实际需求进行扩展和优化,例如增加目标物体的筛选条件或限制控制范围。
需要注意的是,该脚本中涉及物理检测和复杂的逻辑,可以根据项目需求进行适当的性能优化。在实际应用中,我们可能需要增加一些安全网来防止过度资源消耗。
通过以上两部分代码演示,可以实现类似于PC端游戏中的鼠标控制效果。在实际操作中,可以根据项目需求进行调整和优化。
转载地址:http://knqtz.baihongyu.com/