加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Unity3D游戏开发之NPC对话系统的简单实现

(2014-10-13 17:32:55)
标签:

u3d培训

unity3d培训

unity培训

unity教程

分类: Unity3D游戏开发系列教程

Unity3D游戏开发之NPC对话系统的简单实现

       

       我们今天希望实现的是RPG游戏中的NPC对话系统。今天的思路是这样的,首先,我们根据用户鼠标的位置向NPC发射射线,如果射线击中了NPC,则进入对话状态。当用户按下空格键或者单击鼠标左键时,开始显示事先定义好的NPC对话数据。由于传统的GUI方式效率过低,所以我们今天采取的方式是再场景中使用GUI Text ,然后在脚本中更新它的内容,这样就实现了与NPC对话的目的。我们继续使用在前面的文章中搭建的场景,如图:

http://img.blog.csdn.net/20140423002604781

       我们接下来向场景中拖入一个熊的模型作为我们这里的NPC,在Tag中添加NPC后,为其设置NPC标签,并加上一个合适的触发器,这里使用的是球体触发器。接下来,我们创建一个GUI Text,将其命名为Description,它将作为我们显示NPC对话的一个GameObject。到目前为止,场景我们已经搭建完成了。接下来,我们来编写用于控制NPC对话的脚本NPC.cs:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class NPC MonoBehaviour  
  5.       
  6.     //定义NPC对话数据  
  7.     private string[] mData={"你好,我是NPC","这是一个Unity3D编写的脚本" 
  8.         "对话框是基于GUI实现的","我是一个喜欢游戏的人","这是一个关于NPC对话的简单实现"  
  9.         ,"大家就不要笑话这个界面丑陋了啊"};  
  10.     //当前对话索引  
  11.     private int index=0;  
  12.     //用于显示对话的GUI Text  
  13.     public GUIText mText;  
  14.     //对话标示贴图  
  15.     public Texture mTalkIcon;  
  16.     //是否显示对话标示贴图  
  17.     private bool isTalk=false 
  18.       
  19.     void Update ()   
  20.      
  21.       //从角色位置向NPC发射一条经过鼠标位置的射线  
  22.       Ray mRay=Camera.main.ScreenPointToRay(Input.mousePosition);  
  23.       RaycastHit mHi;  
  24.       //判断是否击中了NPC  
  25.       if(Physics.Raycast(mRay,out mHi))  
  26.        
  27.          //如果击中了NPC  
  28.          if(mHi.collider.gameObject.tag=="NPC"   
  29.           
  30.             //进入对话状态  
  31.             isTalk=true 
  32.             //允许绘制  
  33.             if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))  
  34.              
  35.               //绘制指定索引的对话文本  
  36.               if(index
  37.                
  38.                 mText.text="NPC:"+mData[index];  
  39.                 index=index+1;  
  40.               }else  
  41.                
  42.                 index=0;  
  43.                 mText.text="NPC:"+mData[index];    
  44.                
  45.              
  46.           
  47.        
  48.      
  49.       
  50.     void OnGUI()  
  51.      
  52.        if(isTalk)  
  53.         
  54.          //禁用系统鼠标指针  
  55.          Screen.showCursor=false 
  56.          Rect mRect=new Rect(Input.mousePosition.x-mTalkIcon.width,  
  57.                 Screen.height-Input.mousePosition.y-mTalkIcon.height,  
  58.                 mTalkIcon.width,mTalkIcon.height);  
  59.          //绘制自定义鼠标指针  
  60.          GUI.DrawTexture(mRect,mTalkIcon);  
  61.         
  62.           
  63.      
  64.  

       在上述脚本中,我们根据isTalk标志来判断是否进入了对话状态,如果进入对话状态,则将系统默认的鼠标指针修改为我们自定义的鼠标指针,提示用户要进入对话了。在此前提下,如果用户按下了空格键或者鼠标左键,则NPC会依次将对话数据一句一句地显示出来,当所有对话显示完全后,我们将索引清零,让对话从头开始,依次循环。

      好了,我们一起来看看最终实现的效果吧,这里给对话文本加上了背景:

http://img.blog.csdn.net/20140423003441281

http://img.blog.csdn.net/20140423003458406

http://img.blog.csdn.net/20140423003522703

http://img.blog.csdn.net/20140423003539015

http://img.blog.csdn.net/20140423003553718

http://img.blog.csdn.net/20140423003611093

         

更多精彩请到http://www.gopedu.com/


        背景加上效果会好很多,不过目前还没有想到如何能够使对话框背景响应用户的操作的办法

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有