Unity角色对话
对话类---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class word {
public int state;//对应的剧情状态
public string[] sentence;//角色双方说的每句话
public int[] roleOrder;//每句话对应的角色,好吧暂时用不上
}
//对话类,点击I键触发对话,每一句话会以每隔一小段时间片显示一个字符的形式显示,读完该句话之后,再点击I键跳转到下一句,如果没有句子了,那么
//结束对话,对话的相应句子映射到场景控制器类中,场景控制器根据当前的场景状态设置对话框的显示与否,并且将读取的句子填充到对话框中
//句子列表表示不同的剧情状态下的对话内容
//通过继承对话类,对话的对象可以是npc,也可以是任何可以触发对话的物体
public abstract class TalkManager:MonoBehaviour{
public Transform role01;//角色01
public Transform role02;//角色02
public int roleState=0;
public List<word> words;//句子
public float letterTime;//出现单词的间隔时间
public int wordsIndex;//剧情对话的内容下标
public int sentenceIndex;//对话内容的句子的下标
public int letterIndex;//单词的下标
public GameObject UI_text;
float time;
string currentSentence;//当前句子
private void OnTriggerStay2D(Collider2D collision)
{
if (SceneControl.state == 0 && Input.GetKeyDown(KeyCode.I)&&collision.tag.Equals("Player")) {
for (int i = 0; i < words.Count; i++) {
if (words[i].state == GameManager.taskState) {//查询该角色的对话库,获取到与当前剧情对应的对话,并建立对话
roleState = 1;
SceneControl.state = 2;
sentenceIndex = 0;
wordsIndex = i;
letterIndex = 0;
time = Time.time;
role01 = collision.gameObject.transform;
InitBegin();
break;
}
}
}
}
protected void dialogue()
{
if (sentenceIndex < words[wordsIndex].sentence.Length)
{
//读取当前句子的每一个单词
loadLetters();
//如果当前句子已经读完,当前对话没有读完还有下一句,那么读取下一句
if (letterIndex == words[wordsIndex].sentence[sentenceIndex].Length && Input.GetKeyDown(KeyCode.I) && Time.time > time)
{
sentenceIndex += 1;
letterIndex = 0;
currentSentence = "";
}
}
else {//如果对话内容已经读完,那么设置state为0
SceneControl.state = 0;
roleState = 0;
InitEnd();
}
}
//读取当前句子的每一个字符
void loadLetters() {
if (letterIndex < words[wordsIndex].sentence[sentenceIndex].Length&&Time.time>time) {
currentSentence += words[wordsIndex].sentence[sentenceIndex][letterIndex];
//Debug.Log(currentSentence);
SceneControl.currentSentence = currentSentence;
letterIndex += 1;
time = Time.time + letterTime;
}
}
public abstract void InitBegin();
public abstract void InitEnd();
}
角色子类-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//继承自对话类,可以灵活的对对话做出相应的操作
public class role01 : TalkManager {
GeneralPeopleController generalPeopleController;
public Transform attachedObj;//好吧,这里由于我建立的角色的一些物理上的程序缺陷,所以此类的物体不是作为某个对话对象的子物体,而是跟随绑定
private void Start()
{
generalPeopleController = attachedObj.GetComponent<GeneralPeopleController>();
}
private void Update()
{
transform.position = attachedObj.position;
//对话过程
if (roleState == 1) {
dialogue();
}
}
public override void InitBegin()
{
generalPeopleController.horizonDir = (int)Mathf.Sign(role01.position.x - attachedObj.position.x);
generalPeopleController.SetRole(2);
Debug.Log(SceneControl.state);
}
public override void InitEnd()
{
generalPeopleController.SetRole(0);
roleState = 0;
Debug.Log(SceneControl.state);
}
}
场景控制类-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Serialization;
[System.Serializable]
public class WayPoint {
public int pathPoint;//路径点标记
public Transform PointAnchor;//路径点的位置
}
public class SceneControl : MonoBehaviour {
[SerializeField]
public static int state;//0正常,1改变场景,2交互
public static int pathPoint;//角色传送到当前场景时对应通过的路径点标记
public static string currentSentence;
public List<WayPoint> list = new List<WayPoint>();
public Transform player;
//对话框
public GameObject talkImg;
Text text;
//退出UI界面
public GameObject panelMenue;
private void Start()
{
foreach (WayPoint point in list) {
if (point.pathPoint == pathPoint && point.PointAnchor && player) {
player.position = point.PointAnchor.position;
break;
}
}
if(talkImg)//填充句子到对话板中
text = talkImg.GetComponentInChildren<Text>();
if (talkImg&&talkImg.activeInHierarchy) talkImg.SetActive(false);
}
void Update()
{
if (state == 2)
{
if (talkImg.activeInHierarchy == false) talkImg.SetActive(true);
text.text = currentSentence;
}
else {
if (talkImg&&talkImg.activeInHierarchy) talkImg.SetActive(false);
}
if (Input.GetKeyDown(KeyCode.Escape)&&panelMenue) {
if (panelMenue.activeInHierarchy)
{
panelMenue.SetActive(false);
}
else {
panelMenue.SetActive(true);
}
}
}
}
Unity角色对话的更多相关文章
- unity 角色换装
unity角色换装的关键是更改角色部位上的物体的SkinnedMeshRenderer组件的属性: 更改mesh:mesh决定了部位的物体的外形,是主要的数据. 刷新骨骼:同一个部位下,不同的mesh ...
- Unity 角色复活和重新开始游戏
作者写游戏完成的时候,还需要从新想下如何把游戏设置重新开始,角色如何复活. 一般大多数都会采用这种方式来代替游戏重新开始 Application.LoadLevel("xxx场景" ...
- Unity 角色移动贴墙行走
直接贴上代码,旋转角色角度检测碰撞 Vector2 v2Normal = new Vector2(normal.x, normal.y); float fAngle = Vector2.SignedA ...
- Unity 角色场景传送功能
传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine. ...
- unity 角色旋转
using UnityEngine; using System.Collections; public class Triangle : MonoBehaviour { public float sp ...
- Unity角色残影特效
残影特效在网上有很多例子,比如这个,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用. 这里只针对SkinnedMeshRenderer的网格 ...
- unity assetStore 常用插件
常用插件 20180723============= 教程类 =============<Mecanim Example Scenes > 官方示例场景<Surivial Shoot ...
- 通过XML文件实现人物之间的对话
一.建立一个XML文档,放在项目中Assert/Resources/XML文件下 XML的内容如下: <?xml version="1.0" encoding="u ...
- unity对话代码
这个是根据网上unity GUI打字机教程修改的 原教程是JS,我给改成了C#,然后增加了许多功能 这个教程能实现一段文字对话,有打字机显示效果,能写许多对话,能快进对话,总之现在RPG游戏里有的功能 ...
随机推荐
- Python学习--- requests库中文编码问题
为什么会有ISO-8859-1这样的字符集编码 requests会从服务器返回的响应头的 Content-Type 去获取字符集编码,如果content-type有charset字段那么request ...
- MySql8.0.15 window 初始化 修改密码
1.将安装包解压到安装目录: 2.将安装目录下的bin文件目录添加到系统变量中: 3.初始话数据库 mysqld --initialize --console 执行完成后,会打印 root 用户的初始 ...
- 【8】python文件的读写方法
(1).读文件的步骤: (1)打开文件 open(path,flag,encoding,[errors]) path:打开路径 flag:打开方式 r(只读) rb(二进制格式) r+(可以读写) w ...
- FastDFS分布文件系统Java客户端使用
原文链接:http://blog.csdn.net/xyang81/article/details/52847311 Java客户端源代码和jar:链接:http://pan.baidu.com/s/ ...
- Arcgis创建SDE_Geometry、SDO_Geometry的区别
先初略的了解下SDE_Geometry和SDO_Geometry的区别: 1. SDO_GEOMETRY Oracle Spatial在MDSYS模式下定义了一系列几何类型.函数来支持空间数据的存储和 ...
- hdu 1754 I Hate It (线段树功能:单点更新和区间最值)
版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/32982923 转载请注明出处 ...
- STM32学习之路-LCD(2)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011791262/article/details/27711881 这些天一直在研究LCD的初始化 ...
- JSON无限折叠菜单编写
最近看了一篇关于JSON无限折叠菜单的文章 感觉写的不错,也研究了下代码,所以用自己编码方式也做了个demo 其实这样的菜单项在我们网站上或者项目导航菜单项很常见的一种效果,特别是在一些电子商务网上上 ...
- Android 配置从GitHub上下载下来的不太规则的源代码库,并保证程序正常运行
用过github的朋友一定会发现,我们在github上下载下来的源代码(例子和库),放到eclipse中并不是总能正常运行的,它有可能会出现这样或者那样的错误,例如:找不到jar包,配置文件错误,R文 ...
- C. Sad powers
You're given Q queries of the form (L, R). For each query you have to find the number of such x that ...