unity精通之路01(SpaceShooter01)


)

载入资源

这是我第一篇博客,主要记录和总结每次demo学习到的东西,这次是unity官方案例第一个demo,可以从unity中的Asset Store搜索SpaceShooter就能免费下载资源。

载入飞船

在Project文件夹中选中vehicle——playship并拖进Hierarchy重命名为Player,重置Transform属性,并为飞船添加刚体组件(Add Component->Physics->Rigidbody),主要用途是后续可以通过脚本使飞船获得外作用力,此外取消Use Gravity的勾选,因为不需要用到外力。接着为飞船添加碰撞组件Mesh Collider(添加方法和上面类似)主要目的是让飞船能与随机出现的阻碍物发生碰撞并在发生后使自身和碰撞物摧毁的事件。在Mesh Collider中的Mesh网络把Project->Model->player_collider拖进去。(简化模型,减少不必要的运算),同时还要勾选IS Trigger和Convex从而将Mesh Collider变为触发器。

1.通过脚本使飞船移动

在Project资源窗口中右键选择Create->C# Script创捷脚本,重命名为PlayerController双击进入VS编辑。
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Playcontroler : MonoBehaviour {
public float speed; //设置一个速度变量
void FixedUpdate() //固定频率更新
{
float moveHorizontal = Input.GetAxis(“Horizontal”); //检测水平方向移动的键位
float moveVertical = Input.GetAxis(“Vertical”); //检测垂直方向移动的键位
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); //实例化3D向量,因为游戏是xz面移动,所以y值为0
GetComponent< Rigidbody>().velocity = movement * speed;
}
}

这样运行游戏,就能通过键盘控制飞船移动,而按哪些键来控制飞船就要看你在unity中的设置(Edit->Project Settings->Input)。
注意在输入键位名称要正确,不然unity识别不了会报错

2.把脚本和游戏对象绑定

在Project中选择脚本文件并拖进Hierarchy中的Player中,绑定成功能在Player的Inspector中看到脚本,并且能在unity中设定speed的值。注意脚本文件名字要和代码里继承MonoBehavior类的类名称一致,不然会报错

3.使飞船移动时不会超出游戏界面

执行了上面两步后运行游戏会发现,飞船能超出界面进行移动,为了使游戏能顺利进行,必须限制飞船的移动范围,添加类代码如下:

public class Boundary
{
public float xMax,xMin,zMax,zMin;
}

接着在public class Playcontroler : MonoBehaviour 中定义新变量

public Boundary boundary;

要将物体固定在范围内,可以使用unity提供的函数Mathf.Clamp的函数来实现,具体这函数的解说可以查看文档,添加如下代码:

GetComponent< Rigidbody>().position = new Vector3
(
Mathf.Clamp(GetComponent< Rigidbody>().position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp(GetComponent< Rigidbody>().position.z, boundary.zMin, boundary.zMax)
);

从代码可以看出实例化Vector3所需要的就是x,y,z的数值,而Mathf.Clamp函数所需要的值也是每个方向上的最值。通过移动飞船到显示界面边缘就能得到boundary中的x,z的最值。

4.为飞船添加移动使能旋转的功能

为使游戏变得更生动,可以使用Euler函数,实现方法如下:

public float tilt=5.0f

在void FixUpate函数中加入

GetCompont< Rigidbody>().rotation=Quaternion.Euler(0.0f, 0.0f,GetComponent< Rigidbody>().velocity.x * -tilt);

通过改变Z的角度使飞船有旋转的功能

载入背景

创建一个平面(GameObject ——>3D Object——>Quad),重命名为Background,重置Transform,移除Mesh Collider,此时background垂直与飞船。将background旋转90度时背景和飞船平行(Rotation(90,0,0)),把纹理拖进background对象上,按照纹理分辨率比例来调整大小,防止失真,将shader模式为Unit/Texture。

创建电光弹

1.创建一个空的游戏对象

命名为Bolt,重置transform属性,加胶囊体组件和刚体组件,取消Rigidbody勾选Use Gravity,在Capsule Collider中勾选Is Trigger选为触发器,设置Direction属性值为Z-Axis,并设置Radius为0.04,Hegiht为0.65

2.创建一个平面Quad

该平面为Bolt的子对象,命名为VFX,重置Transform属性,将Rotation属性值为(90,0,0),去除Mesh Collider组件

3.新建Move.cs脚本绑定到Bolt上

代码如下:

void Start()
{
GetComponent< Rigidbody>().velocity=transform.forward*speed;
}

4.存储子弹预设体

新建一个预设prefabs,将子弹Bolt拖到Project中的prefabs中,完成子弹预设体创建,从Hierarchy视图中删除Bolt

5.用脚本控制飞船发射子弹

1)为Player新建一个空的子对象Shot Spawn,设置其position的值为(0,0,0.7),在这个位置发射子弹
2)创建新脚本,并绑定在Player对象上。
3)我们需要在脚本存储Bolt游戏对象,作为Instantiate(拷贝函数)的第一个参数
4)存储发射位置,作为实例化Bolt的位置
5)设置一定的发射频率
首先定义一下函数要的变量:

public float fireRate=0.5f;
public GameObect shot;
public Transform shotSpawn;
private float nextFire=0.0f;

其中shotSpawn也是GameObject类型,不过可以直接声明Transform类型,简化代码
然后重载PlayerController类的Update方法:

void Update()
{ if(Input.GetButton(“Fire1”) &&Time.time>nextFire)
{ nextFire=Time.time+fireRate;
Instantiate(shot,shotSpawn.position,shotSpawn.rotation);
}
}

6)为变量赋值,直接把Bolt拖到Player的Inspector上对应的shot变量,shot Spawn一样

6.管理子弹的生命周期

1)新建一个Cube对象,命名为Boundary,重置tansform组件
2)切换到Game窗口,调整Boundary对象的位置,大概想好子弹到哪里消失,就把Boundary边缘放到哪
3)设置Boundary对象的Box Collider组件为触发器,由于在场景中不需要显示Boudary对象,所以将Mesh Renderer组件移除
4)创建脚本DestroyByBoundary

void OnTriggerExit(Collider other)
{
Destroy(other.gameObject);
}

5)运行游戏调整Boundary位置

#第一部分先到这里,这专栏主要记录每个官方案例所学到我自认为比较常用的游戏功能,期待下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值