首页 > 其他分享 >unity 中实现 rts 游戏对士兵的选择和移动

unity 中实现 rts 游戏对士兵的选择和移动

时间:2023-09-24 14:23:30浏览次数:29  
标签:hit 游戏 角色 void unity rts using selectedArray public

playerController 部分用来处理玩家鼠标对场景内元素交互的逻辑

代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
    //场景中的士兵角色列表
    public GameObject[] selectedArray;

    // Start is called before the first frame update
    void Start()
    {
        //获得场景中的士兵角色对象并存到我们的selectedArray中
        selectedArray = GameObject.FindGameObjectsWithTag("soldier");
    }

   
    void Update()
    {
        CameraRadiographicTesting();
    }

    /// <summary>
    /// 鼠标点击发出射线。
    /// </summary>
    private void CameraRadiographicTesting()
    {
        //鼠标右键
        if (Input.GetMouseButton(1))
        {
            //射线检测
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            bool isCollider = Physics.Raycast(ray, out hit);
            if (isCollider)
            {
                for (int i = 0; i < selectedArray.Length; i++)
                {
                    if (selectedArray[i].GetComponent<SoldierController>().GetSelected())
                    {
                        //为选中的士兵设置移动目标
                        selectedArray[i].GetComponent<NavMeshAgent>().SetDestination(hit.point);
                    }
                }
            }
        }
        //鼠标左键
        if (Input.GetMouseButton(0))
        {
            //将之前选择的角色设置为非选中状态
            GameObject[] allSolierGameObj = GameObject.FindGameObjectsWithTag("soldier");
            for (int i = 0; i < allSolierGameObj.Length; i++)
            {
                allSolierGameObj[i].GetComponent<SoldierController>().SetSelected(false);
            }
            //射线检测
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            bool isCollider = Physics.Raycast(ray, out hit);
            if (isCollider)
            {
                //获得检测到物体的GameObject
                SoldierController hitStatus = hit.collider.gameObject.GetComponent<SoldierController>();
                if (hitStatus != null)
                {
                    //通过自己封装的SetSelected函数设置士兵脚本中的selected的值
                    hitStatus.SetSelected(true);
                }
            }



        }

    }
}

SoldierController 用来处理士兵对操作的相应

代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class SoldierController : MonoBehaviour
{
    //当前角色是否被选择
    private bool Selected = false;
    //角色Ai导航
    private NavMeshAgent agent;
    //角色动画控制器
    private Animator soldierAnimator;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        soldierAnimator = GetComponentInChildren<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        SoldierAnimationController();
        SoldierAnimationController();
    }

    //设置角色是否被选择
    public void SetSelected(bool Selected)
    {
        this.Selected = Selected;
    }

    //获得角色是否被选中的信息
    public bool GetSelected()
    {
        return this.Selected;
    }
    //角色移动
    public void MoveTo(Vector3 position)
    {
        if (position != null)
        {
            agent.SetDestination(position);

        }
    }

    //角色的移动动画实现
    void SoldierAnimationController()
    {
        Vector3 forward = transform.forward;
        Vector3 right = transform.right;
        float forwardSpeed = Vector3.Dot(forward, agent.velocity);
        float rightSpeed = Vector3.Dot(right, agent.velocity);
        soldierAnimator.SetFloat("speed", forwardSpeed);
        soldierAnimator.SetFloat("direction", rightSpeed);
    }

}

标签:hit,游戏,角色,void,unity,rts,using,selectedArray,public
From: https://www.cnblogs.com/qi-Blog/p/17725929.html

相关文章

  • Hive的使用以及如何利用echarts实现可视化在前端页面展示(四)---连接idea使用echarts
    说来惭愧,我的javaweb烂得一批,其他步骤我还是很顺利地,这个最简单的,我遇到了一系列问题。只能说,有时候失败也是一种成功吧这一步其实就是正常的jdbc,没什么可说明的,但是关于使用echarts我还是遇到了一些困难,如果有高手能指正一二,感激不尽echarts获取前端数据要使用Ajax,我不会这个语......
  • Hive的使用以及如何利用echarts实现可视化在前端页面展示(三)---hive数据利用sqoop导
    1、安装sqoop我的版本jdk1.8hadoop3.1.3sqoop1.4.6基本上就安装这个版本都没问题,如果是执行连接数据库命令时报错:java.lang.NoClassDefFoundError;报错,在lib下再放一个commons-lang-2.6.jar即可,sqoop安装:Indexof/dist/sqoop(apache.org)commons-lang-2.6.jar下载:commo......
  • Hive的使用以及如何利用echarts实现可视化在前端页面展示(二)---hive部分的实现
    1、利用远程连接器上传csv文件2、进入hive创建表结构:创建一个Hive表的SQL语句:这个表名为 "sales",包含了五个列:day_id、sale_nbr、buy_nbr、cnt 和 round。此表的数据格式为逗号分隔的文本文件,每一行都用逗号分隔字段。createtablesales(day_idstring,sale_nbrstring,b......
  • MPEG(Moving Picture Experts Group)协议发展史
    MPEG(MovingPictureExpertsGroup)是一个国际标准化组织,致力于制定数字多媒体编码标准。MPEG协议的发展史可以追溯到20世纪80年代初。以下是MPEG协议的主要发展历程:MPEG-1:发布时间:1993年MPEG-1是MPEG协议的第一个版本,主要用于压缩视频和音频。它最著名的应用之一是VideoCD(VCD),这是......
  • portswigger——服务器端模板注入(SSTI)
    什么是服务器端模板注入?服务器端模板注入是指攻击者能够使用本机模板语法将恶意负载注入模板,然后在服务器端执行。模板引擎旨在通过将固定模板与易失性数据相结合来生成网页。当用户输入直接连接到模板中,而不是作为数据传入时,可能会发生服务器端模板注入攻击。这允许攻击者注入......
  • P3866 [TJOI2009] 战争游戏
    2023-09-23题目P3866[TJOI2009]战争游戏难度&重要性(1~10):6题目来源luogu题目算法最小割解题思路这道题比较简单。我们考虑建图,需要注意的是我们要将点权变为边权:当\(a_{i,j}=0\)时,\(S\tou\)流量为\(inf\),同时\(u\tou+n\timesm\)流量为\(inf\)当\(a_{i......
  • Clion中使用QtCharts导致进程直接退出
    解决办法:除了需要Qt6Charts.dll外,还需要引入QtOpenGL.dll、QtOpenGLWidgets.dll。最近在看H264编码相关的实现,一头雾水。顺便写了个二进制读取文件的小工具,方便分析码流。地址:BinaryView:使用二进制查看文件,(gitee.com)贴一下CMakeList:find_package(Qt6COMPONENTS......
  • 弹幕游戏小程序系统软件开发
      一、游戏背景  弹幕游戏之前是在直播间出现的,玩的人多了,知道的人多了,就有部分人开始参与进来了。正受到越来越多游戏玩家的喜爱,通过在游戏中引入实时弹幕系统,能增加游戏的互动性和社交性。  二、主要功能设计  1.弹幕发送与接收:玩家在直播间发送字幕参与游戏,......
  • (九)Unity性能优化-预制体优化
    原链接:https://github.com/lwwhb/Unity2022_SUNTAIL_Stylized_Fantasy_Village_Optimization预制体Prefab​Unity中的预制体是用来存储游戏对象、子对象及其所需组件的可重用资源,一般来说预制体资源可充当资源模版,在此模版基础上可以在场景中创建新的预制体实例。使用预制体的......
  • 看广告视频游戏系统开发
      软件在开发之前,先做好市场的调研,了解广告主和玩家的需求,分析得出调研结果,得出合理方案,功能方案。这样才能提高用户的参与度提高广告的效果,流量自然就会慢慢的多了。  分析看广告软件的功能,软件的产品设计,设计出一套符合用户的的功能界面,技术开发框架和数据处理方便,我们......