unity 确定敌人行走路线
一开始搞这个问题很头疼,无从下手。
1、敌人在随机地点产生后,每个敌人有要有自己自动的行走路线,目的地是保护地,而且行走路线要多样化。
2、敌人在看到玩家时,改变行走路线,向玩家的方向行进,且到了一定距离后停下对玩家进行射击。
3、在玩家躲起来,即敌人无法看到玩家时,敌人要继续按行进路线走到保护地前。
后来知道了Physics.Linecast "线性投射" 这个方法,从开始位置到结束位置做一个光线投射,如果与碰撞体交互,返回真。
这样就有一个大体的思路:
1、给定几个大小位置合适的区域,在这几个区域中随机产生敌人。
2、在场景中设置20~30个合适的点,作为敌人的行走路线点,确保这些点不是两两可见的(即physics.Linecase值为true)。
3、end标签作在保护地点上。
4、下面的方法即为求以start点为起点的敌人的行走路线,road为中间点,way数组为路线。
void init(){
GameObject temp = start ;
while(start.transform.name!=end.transform.name){
float t = 100f ;
for(int i=; i<road.Length; i++){
if(start==road[i]||road[i].tag!="other") continue ;
if(!Physics.Linecast(start.transform.position, road[i].transform.position)){
float t1 = Vector3.Angle(road[i].transform.position-start.transform.position, end.transform.position-start.transform.position) ;
if(Mathf.Abs(t1)<t){
t = Mathf.Abs(t1) ;
temp = road[i] ;
}
}
}
way[wayCnt++] = temp ;
start = temp ;
}
}
5、既然求出了以start为起点的敌人的路线,那么就要得到当前敌人以那个点作为start点。
下面的方法是找出距离当前敌人最近的tag为other的点。
GameObject FindClosestPoint() {
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag("other");
GameObject closest = null ;
float distance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject go in gos) {
Vector3 diff = go.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance&&!Physics.Linecast(go.transform.position, position)) {
closest = go;
distance = curDistance;
}
}
return closest;
}
6、有了上面的两个方法,就在这个敌人产生时确定了他的默认行进路线。下面的方法是让其在行进路线上移动。
void changeRotation(){
if(Vector3.Distance(IgnoreY(transform.position), IgnoreY(nextPoint.transform.position))>0.1f){
Vector3 direction = (IgnoreY(nextPoint.transform.position)-IgnoreY(transform.position)).normalized ;
Quaternion rotation = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, 0.1f);
charCtl.SimpleMove(transform.forward*) ;
}else{
nextPoint = way[index++] ;
}
}
7、当敌人看到玩家时,也就是Physical.Linecast值为false,且在一定距离内
即(!Physics.Linecast(man.transform.position, transform.position)&&(man.transform.position - transform.position).sqrMagnitude<1000f)
敌人要改变行进方向,当到达一定距离时,进行射击。
Vector3 t = man.transform.position - transform.position;
if(!Physics.Linecast(man.transform.position, transform.position)&&t.sqrMagnitude<1000f){
isLook = true ;
Vector3 direction = (IgnoreY(man.transform.position)-IgnoreY(transform.position)).normalized ;
Quaternion rotation = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, 0.1f);
if(t.sqrMagnitude<200f){
if(Time.time-now>fireStepTime){
now = Time.time ;
animation.Play("fire") ;
Vector3 npos = tran.position ;
// fireClone = (GameObject)Instantiate(fireObj, npos, transform.localRotation) ;
// Destroy(fireClone, 0.05f) ;
Ray ray = new Ray(npos, transform.forward);
if(Physics.Raycast(ray, out hit)){
if(hit.transform.tag=="manCon"){
mainCam.SendMessage("getPlayerDamage", 10f) ;
}
}
}
}
}
8、当玩家再次消失在敌人视野中后,敌人要再次找到距离自己最近的点,并作为start点找出行进路线。
unity 确定敌人行走路线的更多相关文章
- 基于WebGL架构的3D可视化平台—实现小车行走路线演示
小车行走路线演示New VS Old 刚接触ThingJS的时候,写的一个小车开进小区的演示,今天又看了教程中有movePath这个方法就重新写了一遍,其中也遇到了一些问题,尤其突出的问题就是小车过弯 ...
- 最大行走路线问题(DP)
在一个NxN的棋盘上,每个格子里有若干个棋子,假设起点为左上角的格子,且每次只能向下或向右走一格,问怎样走才能得到最多的棋子. 这是很简单的递推题了. 因为只能向下或者向右,所以其实我们可以把棋盘看成 ...
- Unity攻击敌人时产生泛白效果
Shader的代码如下,主要是将透明度为1的像素点输出为白色,其中_BeAttack表示角色被攻击的泛白状态 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_M ...
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
- 使用Unity创建塔防游戏(Part1)
How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...
- 使用unity创建塔防游戏(原译)(part1)
塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...
- 使用Unity创建塔防游戏(Part3)—— 项目总结
之前我们完成了使用Unity创建塔防游戏这个小项目,在这篇文章里,我们对项目中学习到的知识进行一次总结. Part1的地址:http://www.cnblogs.com/lcxBlog/p/60759 ...
- 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》
---------------------------------------------------------------------------------------------------- ...
随机推荐
- 【BZOJ】1007: [HNOI2008]水平可见直线(凸包)
题目 传送门:QWQ 分析 在下面维护一个凸壳 好久没写博客了...... 代码 #include <bits/stdc++.h> using namespace std; ; ,INF= ...
- 第一个Net+Mysql的例子,比想象的简单很多
1.window下安装mysql,比较简单,完全的图形化界面,不用看文档一路点击下来也ok,注意中间几个configtype选项就可以. 2.安装MySql Net的驱动程序程序,安装完后就是几个dl ...
- 匿名方法,lambad表达式,匿名类
其实lambad表达式就是“函数”或者说是“方法”写法的一个进化,越来越简化而已,如数学方法里的f(X). 匿名方法:顾名思义,匿名方法就是没有名称的方法,但是有定义参数. 匿名方法最明显的好处就是可 ...
- Julia - 函数的参数传递
不定参数 不定参数的函数也称变参函数 函数的参数可以被定义成任意个 可以在最后一个参数后紧跟省略号“...”来定义变参函数 julia> bar(x, y, z...) = (x, y, z) ...
- Django 模型层(2)
多表操作: 创建模型: 作者模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及em ...
- 【转】Android 中处理崩溃异常并重启程序出现页面重叠的问题
原文地址:http://blog.csdn.net/jiang547860818/article/details/53641113 android开发中经常会遇到程序异常,而已常常会遇到一出现异常AP ...
- Chrome Postman及Firefox Poster使用
Chrome浏览器跟Postman工具共用代理设置及Cookie Firefox浏览器跟Poster工具共用代理设置及Cookie xdebug调试原理 第一次请求url通过参数XDEBUG_SE ...
- Python Tkinter编程
声明:主要是为了自己方便,所以把别人的教程搬到这里来,没有其他的意思. 如果有侵犯您的权益,请联系我QQ:3121922008 我会在第一时间妥善处理,抱歉. 还有其他的一些搜集的资源连接放在http ...
- 使用Dottrace跟踪.net代码执行时间
当程序遇到性能问题,如IIs请求反应缓慢,.net客户端程序执行缓慢,如何分析是哪里出了问题?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,清晰的看出是哪里执行时间过长,然后再分 ...
- leetcode707
数据结构的题,从网上找到的实现方式,先记录下来. class MyLinkedList { public: /** Initialize your data structure here. */ My ...