Unity射击游戏实例—物理碰撞的实现

摘要:
3.其他。tag==“PlayerRocket”比较字符串以确定碰撞体是否是主角的子弹。5.m_life-=rocket.m power语句将逐渐减少护甲,并编写代码以实现移动保护的virtualvoidUpdateMove(){floatrx=Mathf.sin(Time.Time)*敌人游戏体的Time.deltaTime;

前言:

 这一篇章实现物理碰撞,就是游戏体碰撞减装甲,这几天想要试着做出兼具装甲与血量的模式,可自动回复的装甲与永久损伤的血量,在一些平台上找到了不少有意思的模型,有兴趣的可以自己找找模型替换一下。

射击类游戏实例

作为第一个用来发布讲解的游戏,我立马就想到了射击类游戏,当然不是第一人称射击的那种,是打小飞机累计得分的那种类型,方便魔改参数以及自行制作一些敌人的模型。

游戏相关设定:

1.在游戏中,我们将操作战舰击坠敌人的飞船,游戏开始后战舰会向前推进,消灭敌人取得分数,战舰被击落游戏才会结束。

2.战舰拥有固定装甲(血量),敌人有多种并拥有独特的飞行轨迹与装甲

3.屏幕上会显示血量、得分等内容

4.待添加

涉及的英文:

enemy:敌人         box collider:盒碰撞器                  physics:物理                  Gravity: 重力           Rigidbody:刚体             Kinematic:运动学的       Trigger: 触发       

介绍:

1.UpdaMove函数用来执行敌人的移动,使用了Sin函数使数值在-1~1之间循环往复实现往复运动。

2.Time.time是游戏的进行时间。

3.other.tag=="PlayerRocket"比较字符串判断碰撞体是否为主角子弹。

4.Rocket rocket=other.GetComponent<Rocket>()语句获得了对方碰撞体的Rocket脚本组件。

5.m_life-=rocket.m_power语句会逐步减少装甲,到0时使用Destory消除游戏体。

操作:

1.创建Enemy.cs脚本,编写代码实现敌人游戏体的移动

protected virtual void UpdateMove()
    {
        float rx = Mathf.Sin(Time.time) * Time.deltaTime;

        transform.Translate(new Vector3(rx, 0, -m_speed * Time.deltaTime));


    }

2.建立敌人游戏体的prefab,并将Enemy脚本指定给它

3.给敌人游戏体添加碰撞体,【Component】—【Physics】—【Box Collider】,在Inspector窗口找到【Is Trigger】,勾选上

Unity射击游戏实例—物理碰撞的实现第1张

4.添加刚体组件,【Component】—【Physics】—【Rigidbody】,取消【Use Gravity】,勾选【Is Kinematic】

Unity射击游戏实例—物理碰撞的实现第2张

5.给主角重复上述操作

6.【Edit】—【Project Settings】—【Tags and Layers】,新建新的Tag,PlayerRocket和Enemy,选中敌人的prefab修改tag为Enemy,子弹的tag为PlayerRocket,主角的tag为Player(内置的没有就自己创建)

Unity射击游戏实例—物理碰撞的实现第3张

 7.打开Rocket.cs编写代码实现子弹的碰撞消失

 private void OnTriggerEnter(Collider other)
    {
        if (other.tag != "Enemy")
        {
            return;

        }
        else
        {
            Destroy(this.gameObject);
        }
    }

8.打开Player.cs编写代码实现主角的碰撞消失

private void OnTriggerEnter(Collider other)
    {
        if (other.tag != "PlayerRocket"){
            m_life -= 1;
            if (m_life <= 0)
            {
                Destroy(this.gameObject);
            }

        }
    }

9.打开Enemy.cs编写代码实现敌人的碰撞消失与飞出屏幕外自我消失

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

[AddComponentMenu("MyGame/Enemy")]
public class Enemy : MonoBehaviour
{
    public float m_speed = 1;
    public float m_life = 10;
    protected float m_rotspeed = 30;

   public Renderer m_renderer;
   internal bool m_isActiv = false;


    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "PlayerRocket")
        {
            rocket rocket = other.GetComponent<rocket>();
            if (rocket != null)
            {
                m_life -= rocket.m_power;
                if (m_life <= 0)
                {
                    Destroy(this.gameObject);
                }

            }
        }
        else if (other.tag == "Player")
        {
            m_life = 0;
            Destroy(this.gameObject);
        }
    }
    // Start is called before the first frame update
    void Start()
    {

        m_renderer = this.GetComponent<Renderer>();




    }

    private void OnBecameVisible()
    {
        m_isActiv = true;
    }

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

        if (m_isActiv && !this.m_renderer.isVisible)  // 如果移动到屏幕外
        {
            Destroy(this.gameObject); // 自我销毁
        }
    }

    protected virtual void UpdateMove()
    {
        float rx = Mathf.Sin(Time.time) * Time.deltaTime;

        transform.Translate(new Vector3(rx, 0, -m_speed * Time.deltaTime));


    }




}

再说一句:

突然发现很多简单预置函数没有说明,比如说Vector3,之后涉及多了另说明吧,另外像创建碰撞体时候涉及到重力之类的,后面有用到的具体实例说起来应该会很简单,

免责声明:文章转载自《Unity射击游戏实例—物理碰撞的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇adb monkey测试使用及分析[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

XNA框架基础——获取免费的XNA Game Studio Express

获取免费的XNA Game Studio Express 要立刻开始编码,你必须确定你安装了恰当的工具,IDE是快速起步的一个尤其重要的工具。如果你已经完成了XNA Game Studio Express的安装和配置,你可以越过这一个章节。 写这个部份仅仅以防有人需要另外的技巧和窍门。例如,如何在Visual Studio 2005 Profession...

堪比端游 欧美十大RPG网页游戏推荐

你喜欢RPG游戏吗?大多数玩家的回答是肯定的,身临其境的控制一个角色在虚拟的世界中冒险是一种非常神奇的体验。不得不承认,在目前的游戏市场上,不管是客户端游戏和网页游戏,RPG游戏都占据了很大的市场份额,在如此繁多的RPG游戏中肯定不乏精品,今天,小编沧海识珠,选取了10款激动人心的RPG页游(排名不分先后)供大家鉴赏,想知道你心中的游戏是否名列其中吗,让我...

Unity技术面试题

一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。 二:Unity3d中的碰撞器和触发器的区别?答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的...

XNA框架基础——从头开始

从头开始 您已经准备好了一切,现在就让我们开始编码吧!本节您将在XNA Studio模板的帮助下创建一个简单的游戏项目,然后在Update和Draw方法中添加少量代码以实现一些小功能。在下一小节学习了SpriteBatch类之后,您将创建您的第一个游戏。 您的第一个项目 打开XNA Game Studio Express,在菜单栏中选择“文件→新建项目...

冷扑大师AI简史:你用德扑来游戏,人家用来发Science

前言 人类又输了...... 创新工场组织的一场“人工智能和顶尖牌手巅峰表演赛中”,机器人AI冷扑大师赢了人类代表队龙之队 792327 记分牌,最后 200 万奖励归机器人所有。 在围棋项目上人类的一票大师已经被 AlphaGo 虐得得不行。然而这还不算完,最近有在朋友圈里看到不少 “AI 首次在德州扑克战胜人类职业玩家,新算法让机器拥有直觉 ” 这类新...

Windows新终端中玩转ASCII和Emoji游戏的正确姿势

前一段时间,我搬运了几个Windows Terminal中玩游戏的视频,详情请看 发布在即!来一睹官方团队如何玩转 Windows Terminal - 知乎. 今天我来给大家展示一下具体的玩法~ Emoji版双人碰碰球 目前有个现成的 .NET core 项目可以直接用,地址是: mbcrump/pongemoji: A implementation o...