博客
关于我
unity制作类似红警控制效果
阅读量:590 次
发布时间:2019-03-11

本文共 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变量需要在另一个脚本中被赋值。

    1. 挂载在摄像头上的控制脚本这个脚本主要负责检测鼠标的点击和拖拽事件,并向目标物体传达控制信号。以下是一个完整的实现示例:
    2. 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); } } }}

      在这个脚本中,我们主要完成了以下几个步骤:

    3. 检测鼠标按键状态,并记录当前和初始的位置
    4. 在鼠标按住期间,追踪目标物体
    5. 使用射线检测技术确定目标位置
    6. 动态更新目标物体的位置信息
    7. 这个控制逻辑可以根据实际需求进行扩展和优化,例如增加目标物体的筛选条件或限制控制范围。

      需要注意的是,该脚本中涉及物理检测和复杂的逻辑,可以根据项目需求进行适当的性能优化。在实际应用中,我们可能需要增加一些安全网来防止过度资源消耗。

      通过以上两部分代码演示,可以实现类似于PC端游戏中的鼠标控制效果。在实际操作中,可以根据项目需求进行调整和优化。

    转载地址:http://knqtz.baihongyu.com/

    你可能感兴趣的文章
    OSPF 学习
    查看>>
    OSPF 支持的网络类型:广播、NBMA、P2MP和P2P类型
    查看>>
    OSPF 概念型问题
    查看>>
    OSPF 的主要目的是什么?
    查看>>
    OSPF5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
    查看>>
    SQL Server 存储过程分页。
    查看>>
    OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!
    查看>>
    OSPF不能发现其他区域路由时,该怎么办?
    查看>>
    OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
    查看>>
    SQL Server 存储过程
    查看>>
    OSPF在什么情况下会进行Router ID的重新选取?
    查看>>
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>