Unity学习笔记五
接着笔记四:
1.首先需要了解一下继承MonoBehaviour的GameObject有哪些方法是响应鼠标事件的:
public bool hasBullets()
{
if (bullets > 0)
{
这次要做的主要内容是:
- 鼠标移到怪物身上,界面出现当前怪物的血量
- 怪物响应玩家射击,血量减少
- 创建预设:把怪物分布到各个地方
2.这里我们需要用到的方法是:OnMouseOver、OnMouseExit、OnMouseDown,在EnemyController中新建一下方法:
//怪物初始总血量
private int blood = 100;
private int blood = 100;
//怪物响应鼠标事件
void OnMouseDown()
{
void OnMouseDown()
{
if (true == isShowBlood && blood > 0 && true == bulletController.hasBullets ()) {
isAttacked = true; //触发被攻击状态
blood = blood - 5;
if (0 >= blood)
{
dead();
}
}
}
//鼠标移到怪物身上显示怪物血量
void OnMouseOver()
{
isShowBlood = true;
}
void OnMouseExit()
{
isShowBlood = false;
}
isAttacked = true; //触发被攻击状态
blood = blood - 5;
if (0 >= blood)
{
dead();
}
}
}
//鼠标移到怪物身上显示怪物血量
void OnMouseOver()
{
isShowBlood = true;
}
void OnMouseExit()
{
isShowBlood = false;
}
3.新建一个类RoleBulletController,用来控制玩家的子弹个数,并绑定在主角身上:
//初始子弹个数
private int bullets = 100;
public bool hasBullets()
{
if (bullets > 0)
{
//每检测一次就相当于发射一个子弹
bullets--;
return true;
}
else
{
return false;
}
}
bullets--;
return true;
}
else
{
return false;
}
}
4.新建两个贴图,并把图片拖动到脚本上赋值:
//是否显示血量
private bool isShowBlood = false;
//血量背景贴图
public Texture2D bloodBgTexture;
//血量贴图
public Texture2D bloodTexture;
private bool isShowBlood = false;
//血量背景贴图
public Texture2D bloodBgTexture;
//血量贴图
public Texture2D bloodTexture;
//画实时血量
void OnGUI()
{
if (true == isShowBlood)
{
GUI.DrawTexture(new Rect(0, 0, bloodBgTexture.width, bloodBgTexture.height), bloodBgTexture);
GUI.DrawTexture(new Rect(0, 0, bloodTexture.width * (blood * 0.01f), bloodTexture.height), bloodTexture);
}
}
void OnGUI()
{
if (true == isShowBlood)
{
GUI.DrawTexture(new Rect(0, 0, bloodBgTexture.width, bloodBgTexture.height), bloodBgTexture);
GUI.DrawTexture(new Rect(0, 0, bloodTexture.width * (blood * 0.01f), bloodTexture.height), bloodTexture);
}
}
5.修改checkState方法,使得怪物即使距离过远,但是被主角攻击之后还是会向主角跑来:
//检测怪物状态
private void checkState()
{
//怪物与主角的距离
float dist = Vector3.Distance(role.transform.position, transform.position);
if ((dist <= RUN_TO_ROLE_DISTANCE && dist > ATTACK_DISTANCE) ||
(true == isAttacked && dist > ATTACK_DISTANCE))
{
currentState = STATE_RUN;
}
else if (dist <= ATTACK_DISTANCE)
{
currentState = STATE_ATTACK;
isAttacking = true;
}
else
{
currentState = STATE_IDLE;
}
}
private void checkState()
{
//怪物与主角的距离
float dist = Vector3.Distance(role.transform.position, transform.position);
if ((dist <= RUN_TO_ROLE_DISTANCE && dist > ATTACK_DISTANCE) ||
(true == isAttacked && dist > ATTACK_DISTANCE))
{
currentState = STATE_RUN;
}
else if (dist <= ATTACK_DISTANCE)
{
currentState = STATE_ATTACK;
isAttacking = true;
}
else
{
currentState = STATE_IDLE;
}
}
6.运行程序~! T_T
7.这时候会发现把鼠标移动到怪物身上,根本没反应,这是咋回事呢?
打开API,上面很详细的写到只有GUI元素以及存在碰撞的对象才会响应该方法,
所以接下来就是给怪物加上碰撞。
8.在Hierarchy面板选中怪物对象,添加一个胶囊碰撞(一般人物都是用这个):
9.运行程序,鼠标以上怪物,哟西,血量出来了。
10.然后,因为游戏必然是会有很多的怪物的,为了让我们更方面的在场景里面添加同种怪物,
可以使用预设。
预设 (Prefabs)
预设 (Prefab) 是一种资源 - 存储在工程视图 (Project View) 中可重复使用的游戏对象 (GameObject)。
预设 (Prefabs) 可放入到多个场景中,且每个场景可使用多次。向场景添加一个预设 (Prefab) 时,就
会创建它的一个实例。所有预设 (Prefab) 实例都链接到原始预设 (Prefab),实质上是原始预设的克隆
。不管您的工程中有多少个实例,您对预设 (Prefab) 作薄出任何更改时,您会看到这些更改应用于所
有实例。
11.在Project面板右键新建:
这时候创建出来的是一个空的物体:
然后把上面的怪物拖动到这上面,改名为Robot:
然后就可以随便的往场景中添加这类怪物了。
12.运行程序~!成功。
转载于:https://my.oschina.net/u/185335/blog/200532