太空大战--敌人创建

太空大战–敌人创建

前言

该博客为记录学习太空大战unity项目的过程。

游戏介绍

在游戏中,主角操作太空飞船和敌人的太空飞船战斗。消灭敌人的飞船可以取得一定的分数,游戏没有尽头,如果主角的飞船被击落,则游戏结束。

创建敌人

将文件中的Enemy.fbx模型文件拖入到Hierachy视图中
新建Enemy.cs,并添加代码如下

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

public class Enemy : MonoBehaviour
{
   
    //敌人的速度
    public float m_speed = 1.0f;
    
    //敌人的生命
    public int m_life = 10;

    //获取敌人的transform组件
    protected Transform m_transform;

    // Start is called before the first frame update
    void Start()
    {
   
        m_transform = this.transform;
    }

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

    protected virtual void UpdateMove()
    {
   
        //让敌人左右移动
        float rx = Mathf.Sin(Time.time) * Time.deltaTime;

        //让敌人朝主角方向前进
        m_transform.Translate(new Vector3(rx, 0, -m_speed * Time.deltaTime));
    }
}

指定Enemy.cs为Enemy游戏的脚本组件。
根据创建子弹prefab的方式一样创建Enemy.prefab文件。

物理碰撞

选择Enemy模型,在Inspector视图中选择Component->Physics->RigidBody。为敌人添加一个刚体组件。所有需要物理组件的模型都需要一个刚体组件才可以正常的工作。
在这里插入图片描述
在RigidBody组件中,取消选中Use Gravity使模型不受重力影响。然后选中Is Kinematic使模型的运动不受物理模拟影响。
在这里插入图片描述
选择Enemy模型,在Inspector视图中选择Component->Physics->Box Collider。为敌人添加一个立方体碰撞组件。
在这里插入图片描述
在Box Collider组件中,选中Is Trigger,使其具有触发作用。
在这里插入图片描述
同理,给子弹和主角游戏体添加物理组件。

触发碰撞

选择Edit->Project Settings->Tags and Layers。
选择tags右下角的加号来添加标签。
在这里插入图片描述
先添加两个标签Enemy和PlayerRocket
在这里插入图片描述
选择Player模型,在Inspector视图中把tag设置为Player,Player标签是Unity自带的。
在这里插入图片描述
同理设置Rocket和Enemy的标签为PlayerRocket和Enemy。
打开Enemy.cs,修改代码如下。
1、添加一个OnTriggerEnter函数。在碰撞体互相碰撞时触发。

void OnTriggerEnter(Collider other)
{
   
    //如果撞到的是主角子弹
    if (other.tag == "PlayerRocket") 
    {
   
        //获取该子弹的Rocket属性
        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")
    {
   
        Destroy(this.gameObject);
    }
}

打开Rocket.cs,修改代码如下。
1、添加一个OnTriggerEnter函数

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

    Destroy(this.gameObject);
}

打开Player.cs,修改代码如下。
1、添加一个主角生命属性

public int m_life = 3;

2、添加一个OnTriggerEnter函数,让他撞到敌人时生命值-1


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

打开Enemy.cs,修改代码如下。
1、添加代码,防止敌人为被即使杀死而一直存活,当敌人移动到屏幕外则删除敌人游戏体

//获取敌人的Renderer组件
internal Renderer m_renderer;

//判断是否激活
internal bool m_isActiv = false;

// Start is called before the first frame update
void Start()
{
   
    m_transform = this.transform;
    m_renderer = GetComponent<Renderer>();
}

private void OnBecameVisible()
{
   
    m_isActiv = true;
}

// Update is called once per frame
void Update()
{
   
    UpdateMove();
    if(m_isActiv && !m_renderer.isVisible)
    {
   
        Destroy(this.gameObject);
    }
}

高级敌人

将文件中的Enemy2b.fbx模型文件拖入到Hie视图当中去。
该模型有两个文件,一个为碰撞模型,另一个是游戏中的显示模型。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值