版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

目标

实现功能

道具会在豆子的坐标上随机出现

玩家吃下道具时怪物会改变颜色

道具的随机出现

在AStar算法中可以获得所有豆子的坐标集合

将该坐标集合储存起来

在创建道具时在豆子坐标集合中随机获取一个坐标最为道具创建的位置达到随机创建豆子的目的

  public void SpawnPowerUp()
{
//游戏结束后将不创建道具
if (gameOver)
return;
//使用预制体创建道具
GameObject powerUp = Instantiate(powerUpPrefab);
//道具创建的位置
powerUp.transform.position = walkableList[Random.Range(0,walkableList.Count-1)]-liftBottom;
//道具创建时设置父节点
powerUp.transform.SetParent(powerUpParent.transform);
}

怪物的改变颜色

在游戏控制器中有一个isPowerUp来决定玩家是否得到了PowerUp的道具

//获得道具时
if (GameController.gameController.isPowerUp)
{
//将怪物的颜色设置淡一些
this.GetComponent<SpriteRenderer>().material.color = new Color(0.5f,0.5f,0.8f,1.0f);
}
else
{
//道具失效后怪物的颜色将变为原来的颜色
this.GetComponent<SpriteRenderer>().material.color = Color.white;
}

完成了怪物在玩家吃到道具的时候逃跑

逻辑:

在玩家吃掉道具时,怪物会选择一个角落进行寻路,也是要转到路点移动状态。

选择一个角落时,计算怪物到角落的距离,计算玩家到角落的距离,如果是怪物的距离比较短,就放入候选角落,最后在候选角落里随机选择一个目标点。

实现:

选择角落代码:

    public Vector2 GetEscapeCorner(Vector3 monsterPos)
{
//获得逃跑目标点
List<Vector2> escapable = new List<Vector2>();
for(int i=0;i<v3corners.Length;i++)
{
Vector3 playerPos = playerTrans.position;
float dPlayer = (playerPos - v3corners[i]).magnitude;
float dMonster = (monsterPos - v3corners[i]).magnitude;
if(dMonster<dPlayer)
{
escapable.Add(corners[i].position);
}
}
Vector2 selectCorner = escapable[UnityEngine.Random.Range(0, escapable.Count)];
return selectCorner;
}

怪物内,发现玩家时的状态:

    class SeekState : WaypointState
{
public SeekState(List<Vector2> path): base(path)
{ }
public override void Update(Monster e)
{
if(GameController.instance.isPlayerPowerUp)
{
Vector2 corner = GameController.instance.GetEscapeCorner(e.transform.position);
Vector2 p = GameController.instance.leftBottom;
List<Vector2> path = e.finder.Find((Vector2)e.transform.position-p, corner-p);
for (int i = 0; i < path.Count; i++)
{
path[i] += p;
}
e.stateMaginer.ChangeState(new EscapeState(path));
return;
}
base.Update(e);
}
}

最新文章

  1. 字体在网页中画ICON图标
  2. SVM基本思想和对偶推导笔记-记录毕业论文1
  3. 【仅支持移动设备】Swipe.JS轻量级移动幻灯效果
  4. iOS 关于Layer的疑问
  5. ofbiz进击 第一节。 新建自己的webapp项目
  6. SQL Server2008附加数据库失败
  7. iOS开发--绘图教程
  8. 使用委托的BeginInvoke方法来完成复杂任务的操作
  9. HDU5669 Road 分层最短路+线段树建图
  10. Java 类的成员初始化顺序
  11. 如何使用 AngularJS 的 ngShow 和 ngHide
  12. [Swift]LeetCode358. 按距离为k隔离重排字符串 $ Rearrange String k Distance Apart
  13. O2O、B2B、C2C(通俗讲解)
  14. springcloud config 提取公共参数
  15. CRT和EXCRT学习笔记
  16. SQL Server的一个不显眼的功能 备份文件的分割
  17. mac idea中的文件在finder中打开
  18. 开启你的kali linux DIY之旅
  19. python学习之老男孩python全栈第九期_第二周学习总结
  20. js 继承的几种方式

热门文章

  1. 那些必会用到的 ES6 精粹
  2. js-DOM中基础选择器的整理
  3. Java基础部分-面试题
  4. unity_UGUI养成之路03
  5. 从技术小白到收获BAT研发offer,分享我的学习经验和感悟(赠送相关学习资料)
  6. MSIL实用指南-方法的调用
  7. 深入剖析PHP7内核源码(二)- PHP变量容器
  8. sql建表经验总结——主要是建表现象
  9. macOS平台下Qt应用程序菜单翻译及调整
  10. 计蒜客 ACM训练联盟周赛 第一场 从零开始的神棍之路 暴力dfs