博客
关于我
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/

    你可能感兴趣的文章
    Qt开发——网络编程之UDP客户端
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    postgis求面积、交集等相关函数
    查看>>
    postgis相关函数
    查看>>
    Postgres Docker版本安装mysql_fdw 插件
    查看>>
    Postgres invalid command \N数据恢复处理
    查看>>
    Postgres like 模糊查询匹配集合
    查看>>
    Postgres 自定义函数内实现 in 操作符的递归查询
    查看>>
    Postgres 返回当前时间前后指定天数的集合
    查看>>
    postgres--vacuum
    查看>>
    postgres--wal
    查看>>
    postgres--流复制
    查看>>
    postgres10配置huge_pages
    查看>>
    PostgreSQL 10.0 preview sharding增强 - pushdown 增强
    查看>>
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
    查看>>
    PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
    查看>>
    Qt开发——网络编程UDP网络广播软件之服务器端
    查看>>
    Postgresql 12.9如何配置允许远程连接
    查看>>