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

    你可能感兴趣的文章
    Objective-C实现multiplesThreeAndFive三或五倍数的算法 (附完整源码)
    查看>>
    Objective-C实现n body simulationn体模拟算法(附完整源码)
    查看>>
    Objective-C实现naive string search字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现natural sort自然排序算法(附完整源码)
    查看>>
    Objective-C实现nested brackets嵌套括号算法(附完整源码)
    查看>>
    Objective-C实现nevilles method多项式插值算法(附完整源码)
    查看>>
    Objective-C实现newton raphson牛顿-拉夫森算法(附完整源码)
    查看>>
    Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
    查看>>
    Objective-C实现newton_forward_interpolation牛顿前插算法(附完整源码)
    查看>>
    Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
    查看>>
    Objective-C实现ngram语言模型算法(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现NMS非极大值抑制(附完整源码)
    查看>>
    Objective-C实现NMS非极大值抑制(附完整源码)
    查看>>
    Objective-C实现Node.Js中生成一个UUID/GUID算法(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现NQueen皇后问题算法(附完整源码)
    查看>>
    Objective-C实现number of digits解字符数算法(附完整源码)
    查看>>
    Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
    查看>>