unity简单AI

1.   Unity简单AI编写

       由于这次介绍的AI很简单,羽化就把代码直接贴上,AI分成四个状态:思考,转身,移动,攻击,有经验的人认为羽化这样写得不对,由于这里只是初步实现,所以羽化想实现简单点的操作,就像自动范围内随机移动,锁敌攻击,超出距离复位,近距离察觉等,这里代码送上。这次没有写Android的控制器,但肯定可以在Android下用的-0-

Enemy_AI.js

[javascript]  view plain copy print ?
  1. private var Regression : Vector3;  
  2. public var Player_Prefab : Transform;  
  3. public var Enemy_State : String;  
  4. public var Doing : boolean = true;  
  5. public var Range : float = 4.0;  
  6. public var Bullet : Transform;  
  7. public var Bullet_Prefab : Transform;  
  8.   
  9. //初始化敌人方向和位置  
  10. function Start()  
  11. {  
  12.     transform.localEulerAngles.y = Random.value * 360;  
  13.     Regression = transform.position;  
  14. }  
  15.   
  16. //敌人行动模式  
  17. public var Thinking : boolean = true;  
  18. public var Thinking_Time : float = 1.0;  
  19. private var relativePos : Vector3;  
  20. private var rotation : Quaternion;  
  21.   
  22. public var Facing : boolean = false;  
  23. public var Facing_Time : float  = 2.0;  
  24. public var Facing_Speed : float = 2.0;  
  25.   
  26. public var Moving : boolean = false;  
  27. public var Moving_Speed : float = 0.5;  
  28. public var Moving_Time : float = 4.0;  
  29. public var Moving_Back : boolean = false;  
  30.   
  31. public var Attacking : boolean = false;  
  32. private var Bullet_DO : boolean = true;  
  33. public var Bullet_CD : float = 0.2;  
  34.   
  35. //随机移动方位  
  36. private var R_Position : Vector3;  
  37.   
  38. function Update ()   
  39. {  
  40.     if(Attacking)  
  41.     {  
  42.         Enemy_State = "Attacking";  
  43.         Facing = true;  
  44.         Moving = true;  
  45.         //Doing = true;  
  46.         Thinking = false;  
  47.         var dist2 = Vector3.Distance(Regression, transform.position);  
  48.         if(dist2 > 20)  
  49.         {  
  50.             relativePos = Regression - transform.position;  
  51.             rotation = Quaternion.LookRotation(relativePos);  
  52.             Attacking = false;  
  53.             Moving_Back = true;  
  54.         }  
  55.     }  
  56.     if(!Moving_Back)  
  57.     {  
  58.         var dist = Vector3.Distance(Player_Prefab.position, transform.position);  
  59.         if(dist > 100)  
  60.         {  
  61.             Attacking = false;  
  62.             return;  
  63.         }  
  64.         else if(dist < 5)  
  65.         {  
  66.             Attacking = true;  
  67.         }  
  68.         RayJudge();  
  69.     }  
  70.       
  71.     transform.localEulerAngles.x = 0;  
  72.     transform.localEulerAngles.z = 0;  
  73.       
  74.     if(Thinking && !Attacking && !Moving_Back)  
  75.     {  
  76.         Enemy_State = "Thinking";  
  77.         if(Doing)  
  78.         {  
  79.             StartCoroutine(Think(Thinking_Time));  
  80.             Doing = false;  
  81.         }  
  82.     }  
  83.     if(Facing)  
  84.     {  
  85.         Enemy_State = "Facing";  
  86.         if(Attacking)  
  87.         {  
  88.             relativePos = Player_Prefab.position - transform.position;  
  89.             rotation = Quaternion.LookRotation(relativePos);  
  90.             transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);  
  91.         }  
  92.         else if(Moving_Back)  
  93.         {  
  94.             transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed * 4);  
  95.         }  
  96.         else  
  97.         {  
  98.             transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * Facing_Speed);  
  99.             if(Doing)  
  100.             {  
  101.                 StartCoroutine(Face(Facing_Time));   
  102.                 Doing = false;  
  103.             }  
  104.         }  
  105.     }  
  106.     if(Moving)  
  107.     {  
  108.         Enemy_State = "Moving";  
  109.         if(Moving_Back)  
  110.         {  
  111.             transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 6);  
  112.         }  
  113.         else if(dist > 2)  
  114.         {  
  115.             if(Attacking)  
  116.             {  
  117.                 transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed * 4);  
  118.             }  
  119.             else  
  120.             {  
  121.                 transform.Translate(Vector3.forward * Time.deltaTime * Moving_Speed);  
  122.             }  
  123.         }  
  124.         if(Doing && !Attacking)  
  125.         {  
  126.             StartCoroutine(Move(Moving_Time));  
  127.             Doing = false;  
  128.         }  
  129.     }  
  130. }  
  131.   
  132. //前方锁敌  
  133. function RayJudge()  
  134. {  
  135.     var layerMask = 1 << 2;  
  136.     layerMask = ~layerMask;  
  137.       
  138.     var hit : RaycastHit;  
  139.       
  140.     if(Physics.Raycast (transform.position, transform.TransformDirection(Vector3.forward), hit, 20,layerMask))   
  141.     {  
  142.         var distanceToForward = hit.distance;  
  143.         if(hit.transform.tag == "Player")  
  144.         {  
  145.             Attacking = true;  
  146.             if(Bullet_DO)  
  147.             {  
  148.                 var Create = Instantiate (Bullet_Prefab, Bullet.position, Quaternion.identity);  
  149.                 Create.rigidbody.AddForce (Bullet.forward * 1000);  
  150.                 StartCoroutine(Wait(Bullet_CD));   
  151.                 Bullet_DO = false;  
  152.             }  
  153.         }  
  154.     }  
  155. }  
  156.   
  157. function Wait(waitTime : float)  
  158. {  
  159.     yield WaitForSeconds (waitTime);  
  160.     Bullet_DO = true;  
  161. }  
  162.   
  163. function Move(waitTime : float)  
  164. {  
  165.     print("Move");  
  166.     if(Moving_Back)  
  167.     {  
  168.         yield WaitForSeconds (waitTime * 0.4);    
  169.     }  
  170.     else  
  171.     {  
  172.         yield WaitForSeconds (waitTime + Random.value * 2);   
  173.     }  
  174.     Thinking = true;  
  175.     Moving_Back = false;  
  176.     Moving = false;  
  177.     Facing = false;  
  178.     Doing = true;  
  179. }  
  180.   
  181. function Face(waitTime : float)  
  182. {  
  183.     print("Face");  
  184.     yield WaitForSeconds (waitTime + Random.value);  
  185.     Facing = false;  
  186.     Thinking = false;  
  187.     Moving = true;  
  188.     Doing = true;  
  189. }  
  190.   
  191. function Think(waitTime : float)  
  192. {  
  193.     print("Thinking");  
  194.     yield WaitForSeconds (waitTime + Random.value);  
  195.     R_Position = Regression + Random.insideUnitSphere * Range;  
  196.     R_Position.y = Regression.y;  
  197.     relativePos = R_Position - transform.position;  
  198.     rotation = Quaternion.LookRotation(relativePos);  
  199.     Thinking = false;  
  200.     Moving = false;  
  201.     Facing = true;  
  202.     Doing = true;  
  203. }  

工程截图(这里是9个拿枪的敌人- - 蓝色为控制角色,WASD控制行动)


  

       还是那句话,代码本身并不难,羽化也是初学者写不出让人觉得高深的代码-0-,高手也许看一眼就知道这是一个简单的状态切换判断而已,羽化也是从原来Android游戏经验中提取出来的,因为原来都有个FrameWork,框架控制着整个游戏构成,于是就想像AI也能如此,这种敌人AI要有更多的随机性和针对性才能让人觉得真实吧,代码没什么优化,也许效率不是很好,以后估计要添加复杂地形寻路,技能释放,攻击站位判断等内容了,话说原来杨写的那AI真叫个凶残。。。


2.Unity学习过程中的一些细节分析

         最近群里面人原来越多,当初羽化加圣典2群的时候才30个不到的人,现在已经120个人了,想想Unity普及得也够快的,于是就出现了各种问题有人问,有些问题可能新手一直搞不清楚,老鸟们又懒得回答-0- 羽化不是高手,这里只是说说一些可能遇到的问题,与大家分享下。

1.      获取位置坐标:当你translate.position获取的不是物体在世界的坐标时可以试试translate. localRotation

2.      改变旋转角度:这里多半是用translate.localRotation= Quaternion.Euler(x,y,z);

3.      如何更改鼠标指针图片,这也是羽化以后可能遇到的问题,这里只能简单分析下,首先把鼠标默认指针隐藏掉Screen.showCursor=flase;再用个粒子或者图片代替,具体位置可以用Camera.main.ScreenToWorldPoint()和Input.mousePosition获得。但有个问题就产生了,UI会遮挡鼠标,鼠标图片用UI代替总感觉不妥。。。所以羽化还没想出解决方法- -

4.      有关过场Loading的制作,一张图片还好说,换个Scene或者写个UI都能解决,动态Loading的是用Application.LoadLevelAsync可以达到效果,或者是预加载,具体可以看看羽化无缝地图研究博文里面的一个别墅例子。

5.      也许有一天你也会遇到脚本用C#编写时遇到一些莫名其妙的错误,所以这里羽化建议动态脚本命令最好用js写。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值