unity,射手游戏

这篇具有很好参考价值的文章主要介绍了unity,射手游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


介绍

3d游戏。
玩家自由移动。
持枪发射子弹。
随机生成的坦克追踪玩家。
坦克发射子弹攻击玩家。
hp归零死亡

unity,射手游戏


一,制作玩家具体函数脚本PlayerCharacter

设置float:移动速度、转动速度、子弹发射速度、现在生命值、最大生命值、两次攻击时间间隔。

设置bool:是否正在攻击、是否死亡

其他组件:角色控制器、生命值滑动条、最大生命值颜色(绿色)、最小生命值颜色(红色)、音频源、动画器、粒子系统

public float speed;
public float turnSpeed;
public float health;
public float attackTime;
public float health;
float healthMax;

bool isAlive;
bool attacking = false;

CharacterController cc;
Animator animator;
public Slider healthSlider;                             
public Image healthFillImage;                          
public Color healthColorFull = Color.green;
public Color HealthColorNull = Color.red;

public ParticleSystem explosionParticles;
public Rigidbody shell;
public Transform muzzle;

start方法,获取动画器、角色控制器、生命值最大化、bool设置活着、更新血条滑块、死亡爆炸效果设置为不可见。
animator = GetComponentInChildren<Animator>();
        cc = GetComponent<CharacterController>();
        healthMax = health;
        isAlive = true;
        RefreshHealthHUD();
        explosionParticles.gameObject.SetActive(false);
玩家被攻击,生命值减少amount,更新血条,如果生命值小于零,死亡
 public void TakeDamage(float amount)
    {
        health -= amount;
        RefreshHealthHUD();
        if (health <= 0f && isAlive)
        {
            Death();
        }
    }
更新血条,滑块的value值更新一次,血条由100%的绿色,变成百分之(health / healthMax)的绿色。
  public void RefreshHealthHUD()
    {
        healthSlider.value = health;
        healthFillImage.color = Color.Lerp(HealthColorNull, healthColorFull, health / healthMax);
    }
死亡,角色是否活着设置为否,播放粒子特效,当粒子系统的持续时间结束后,粒子系统对象就会被销毁,设置玩家为不可见。
 public void Death()
    {
        isAlive = false;
        explosionParticles.transform.parent = null;
        explosionParticles.gameObject.SetActive(true);
        ParticleSystem.MainModule mainModule = explosionParticles.main;
        Destroy(explosionParticles.gameObject, mainModule.duration);
        gameObject.SetActive(false);

    }
角色移动,传入一个向量值,必须在活着、没有攻击才能移动。
角色控制器使用simplemove函数,移动的时候,控制“speed”动画,开始播放
 public void Move(Vector3 v)
    {
        if (!isAlive) return;
        if (attacking) return;
        Vector3 movement = v * speed;
        cc.SimpleMove(movement);
        if(animator)
        {
            animator.SetFloat("Speed", cc.velocity.magnitude);
        }
    }
人物旋转函数,玩家往哪里跑,角色人物头就转向哪里
设置目标位置、当前位置
四元数转向
使用球面插值,平滑转动
  public void Rotate(Vector3 lookDir)
    {
        var targetPos = transform.position + lookDir;
        var characterPos = transform.position;

        //去除Y轴影响
        characterPos.y = 0;
        targetPos.y = 0;
        //角色面朝目标的向量
        Vector3 faceToDir = targetPos - characterPos;
        //角色面朝目标方向的四元数
        Quaternion faceToQuat = Quaternion.LookRotation(faceToDir);
        //球面插值
        Quaternion slerp = Quaternion.Slerp(transform.rotation, faceToQuat, turnSpeed * Time.deltaTime);

        transform.rotation = slerp;
    }
开火脚本
必须活着、不正在开火才能调用
生成一个子弹刚体,玩家自身位置,枪口方向转向,设置发射速度
播放开火音效
动画器播放开火动作
延迟attachtime发射一次,设置发射频率
 public void Fire()
    {
        if (!isAlive) return;
        if (attacking) return;

        Rigidbody shellInstance = Instantiate(shell, muzzle.position, muzzle.rotation) as Rigidbody;
        shellInstance.velocity = launchForce * muzzle.forward;
        shootAudioSource.Play();

        if(animator)
        {
            animator.SetTrigger("Attack");
        }


        attacking = true;
        Invoke("RefreshAttack", attackTime);
    }

发射时间间隔脚本,时间未到,不能发射
 void RefreshAttack()
    {
        attacking = false;
    }

三、 制作玩家控制脚本 PlayerController,调用上面的函数方法

start方法获取角色控制器
void Start ()
    {
        character = GetComponent<PlayerCharacter>();
	}
固定帧数刷新。
鼠标左键调用点击开火函数
键盘wsad控制人物移动
人物移动的方向和人物转向的方向保持一致
void FixedUpdate()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            character.Fire();
        }

        var h = Input.GetAxis("Horizontal");
        var v = Input.GetAxis("Vertical");
        character.Move(new Vector3(h, 0, v));
        var lookDir = Vector3.forward * v + Vector3.right * h;
        if (lookDir.magnitude != 0)
        {
            character.Rotate(lookDir);
        }
    }

四、 制作子弹脚本 shell

设置float参数:子弹生存时间、爆炸半径、爆炸力量、最大伤害

设置bool参数:子弹是否正在旋转

设置其他:音频源、层级、粒子系统
    public float lifeTimeMax = 2f;
    public AudioSource explosionAudioSource;
    public ParticleSystem explosionParticles;
    public float explosionRadius;
    public float explosionForce = 1000f;
    public float damageMax = 100f;
    public LayerMask damageMask;
    public bool isRotate = false;

start方法,添加扭矩,模拟子弹旋转

 void Start ()
    {
        if(isRotate)
        {
            GetComponent<Rigidbody>().AddTorque(transform.right * 1000);
        }
    }
触发器碰撞检测
在当前游戏对象的位置上创建一个球形的检测区域,并检测该区域内是否有与指定层级(damageMask)匹配的碰撞器(colliders)。如果有,则返回一个碰撞器数组(Collider[]),其中包含了所有与当前游戏对象在指定半径(explosionRadius)内发生碰撞的游戏对象的碰撞器。通常用于实现爆炸伤害、碰撞检测等功能。	
遍历数组,计算伤害
播放粒子特效
 private void OnTriggerEnter(Collider other)
    {
        Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius, damageMask);

        foreach(var collider in colliders)
        {
            var targetCharacter = collider.GetComponent<PlayerCharacter>();
            if (targetCharacter)
            {
                targetCharacter.TakeDamage(CalculateDamage(collider.transform.position));
            }
        }
        explosionParticles.transform.parent = null;
	     explosionAudioSource.Play();
        explosionParticles.Play();

        ParticleSystem.MainModule mainModule = explosionParticles.main;
	    // Destroy(explosionParticles.gameObject, mainModule.duration);
        Destroy(gameObject);
    }

计算伤害,传入向量值
距离越小,伤害比例越大
设置最低伤害Mathf.Max()函数,最低伤害为2
float CalculateDamage(Vector3 targetPosition)
    {
        
        var distance = (targetPosition - transform.position).magnitude;
        //距离越小,伤害比例越大
        var damageModify = (explosionRadius - distance) / explosionRadius;
        var damage = damageModify * damageMax;
        return Mathf.Max(2f, damage);
    }

五、 给玩家挂载脚本

设置参数,添加预制体子弹
unity,射手游戏


六、 制作坦克脚本

设置导航网格、play对象
	 NavMeshAgent agent;
    PlayerCharacter character;
    Transform targetTrans;
start函数,获取玩家实例,
导航网格寻找玩家
延迟1秒后,每隔三秒发射一次子弹
 void Start ()
    {
        character = GetComponent<PlayerCharacter>();
        agent = GetComponent<NavMeshAgent>();

        targetTrans = GameObject.FindGameObjectWithTag("Player").transform;
        
        InvokeRepeating("FireControl", 1, 3);
    }
开火控制函数,调用共同使用的fire()方法。
 void FireControl()
    {
        character.Fire();
    }

update()函数,不断追踪玩家的位置,
转向玩家
void Update ()
    {
        agent.destination = targetTrans.position;
        transform.LookAt(targetTrans);
    }

七、 给坦克添加组件

unity,射手游戏


八、 开始游戏,播放动画

unity,射手游戏

人物移动、坦克移动

unity,射手游戏


九、 下载

https://pan.baidu.com/s/1RVemZY_THhhpD0v_IcQS2w

提取码:tdq9文章来源地址https://www.toymoban.com/news/detail-411149.html





+

到了这里,关于unity,射手游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity实现2D游戏跟随摄像机(平滑移动)

    摄像机运行效果如下所示。 首先创建一个可用的玩家角色,写好移动逻辑,如果要使用在Unity商店中购买的资源,可以点击Window菜单栏 Package Manager选项,来打开Package Manager窗口,如下所示,然后下载你需要的资源。 如果你没有在资源商店的精灵资产,可以在Hierarchy视图,右

    2024年02月19日
    浏览(55)
  • Unity ECS实现RTS游戏中的游戏单位框选、集结和移动控制

    今天想给大家分享的主题是如何实现RTS类型游戏中的游戏单位角色控制 本文中会介绍如何运用最新的ECS架构来实现游戏单位控制 上方代码实现的功能是获取被鼠标框选的游戏单位,如果需要源代码可以在文末添加爱丽丝老师的QQ或者微信号领取 代码讲解 获取鼠标框选方框的

    2023年04月12日
    浏览(54)
  • 顶级工程师教你移动端游戏性能优化!Unity官方教程!

    ** 本期将给大家介绍如何提高资源、项目配置和图形的性能。所有教程均来自Unity官方,感兴趣的朋友可以去Unity官网查看完整教学内容。 降低或禁用 Accelerometer Frequency(加速度计频率) Unity每秒钟是会以一定次数统计移动设备的加速度计状态的。如果我们的程序不会用到加

    2024年02月20日
    浏览(51)
  • 微信小游戏开发之unity-精灵的创建动画和操作移动

    我们的目标是通过unity开发微信小游戏! 这是第一篇正式实战开发文章,将会很详细介绍每一个步骤和代码。 废话不多说直接操作! 由于目标开发游戏是2D小游戏,我们选择2D核心模板. 我们的目标是开发微信小游戏所以我们需要修改setting,选择运行平台选择转换 WebGL ,刚开

    2024年01月16日
    浏览(68)
  • 【unity与android的交互】移动游戏发布更安心!Unity安卓平台打包相关的常见参数全详解

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 首先需要切换到安卓平台 step1 :打包前的基础参数的设置 step2:包名的设置需要勾选,必须要去设置的内容 打包后进行测

    2024年04月17日
    浏览(75)
  • UE4样条线移动,玩家只需要控制旋转

    1.创建Actor并命名为“A_Spline” 2.创建Pawn并命名为“P1” 3以上创建的蓝图类可以使用自己的命名!!!!! 第二步:给P1写上蓝图 1.我们首先给P1写蓝图 2.在输入映射中设置一个事件Yaw 3.为鼠标的X轴,数值为1 4.如图写上刚刚设置的输入事件 第三步:给A_Spline写上蓝图 1.添加一

    2023年04月09日
    浏览(61)
  • 游戏玩家的新大陆?小红书游戏内容场景洞察

    2023年,如果你问年轻人他们在哪里讨论游戏?他们可能会提到一些平台,比如Steam、TapTap、B站、微博或者论坛。但是如果你向身边的女孩子询问,她们可能会惊喜地告诉你:小红书。 小红书平台一直给人的标签是是“美妆、旅游、美食分享”,但在现在的小红书生态里,“

    2024年02月09日
    浏览(49)
  • 游戏行业实战案例 5 :玩家在线分布

    【面试题】 某游戏数据后台设有“登录日志”和“登出日志”两张表。 「登录日志」记录各玩家的登录时间和登录时的角色等级。  「登出日志」记录各玩家的登出时间和登出时的角色等级。 其中,「角色 id 」字段唯一识别玩家。 游戏开服前两天( 2022-08-13 至 2022-08-14 )

    2024年02月13日
    浏览(40)
  • 「Unity入门」Step by Step的太空清理垃圾游戏Part 3:飞船移动与UI

    完成基础的太空场景后,我们就可以来实现一些可交互的操作了。在这个游戏中主要可交互的操作有控制飞船飞行方向和点按垃圾收集。在游戏开始后,飞船会以恒定的速度向前方移动,用户则可以摇杆来控制飞船左右、上下转动。通过除此之外,还有切换前后镜头、加速等

    2024年02月01日
    浏览(52)
  • 紧密联结玩家 | 2023 Google 游戏开发者峰会

    玩家的选择是对游戏莫大的认可,重视玩家反馈并和他们建立联系是您的游戏取得成功的关键。我们也在努力创造更多机会,让您的游戏从琳琅满目的列表中脱颖而出,帮助您吸引更多用户。 上篇内容我们介绍了帮助您优化游戏性能的几大功能更新,今天的内容我们将剖析大

    2023年04月26日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包