对话类---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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角色对话的更多相关文章

  1. unity 角色换装

    unity角色换装的关键是更改角色部位上的物体的SkinnedMeshRenderer组件的属性: 更改mesh:mesh决定了部位的物体的外形,是主要的数据. 刷新骨骼:同一个部位下,不同的mesh ...

  2. Unity 角色复活和重新开始游戏

    作者写游戏完成的时候,还需要从新想下如何把游戏设置重新开始,角色如何复活. 一般大多数都会采用这种方式来代替游戏重新开始 Application.LoadLevel("xxx场景" ...

  3. Unity 角色移动贴墙行走

    直接贴上代码,旋转角色角度检测碰撞 Vector2 v2Normal = new Vector2(normal.x, normal.y); float fAngle = Vector2.SignedA ...

  4. Unity 角色场景传送功能

    传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine. ...

  5. unity 角色旋转

    using UnityEngine; using System.Collections; public class Triangle : MonoBehaviour { public float sp ...

  6. Unity角色残影特效

    残影特效在网上有很多例子,比如这个,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用. 这里只针对SkinnedMeshRenderer的网格 ...

  7. unity assetStore 常用插件

    常用插件 20180723============= 教程类 =============<Mecanim Example Scenes > 官方示例场景<Surivial Shoot ...

  8. 通过XML文件实现人物之间的对话

    一.建立一个XML文档,放在项目中Assert/Resources/XML文件下 XML的内容如下: <?xml version="1.0" encoding="u ...

  9. unity对话代码

    这个是根据网上unity GUI打字机教程修改的 原教程是JS,我给改成了C#,然后增加了许多功能 这个教程能实现一段文字对话,有打字机显示效果,能写许多对话,能快进对话,总之现在RPG游戏里有的功能 ...

随机推荐

  1. python基础学习9----深浅拷贝

    数据类型有可变类型和不可变类型 不可变类型:整型,长整型,浮点数,复数,布尔,字符串,元组 可变类型:列表,字典 浅拷贝 简单说只对第一层进行拷贝,如下对于列表中的列表的数据进行改变,list1和li ...

  2. 【转】Java学习---volatile 关键字

    [原文]https://www.toutiao.com/i6591422029323305480/ 前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现 ...

  3. 【转】Spring学习---SpringIOC容器的初始化过程

    [原文]https://www.toutiao.com/i6594400249429623304/ SpringIOC容器的初始化过程 简单来说,IoC容器的初始化是由refresh()方法来启动的, ...

  4. 1)HDFS分布式文件系统 2)HDFS核心设计 3 )HDFS体系结构

    一.HDFS简介 1.HDFS:Hadoop distributed file system 一个分布式文件系统 基于流数据模式访问和处理超大文件的需要而开发 适合应用在大规模数据集上 2. 优点 处 ...

  5. dns服务器测试工具

    下载地址:https://www.eatm.app/wp-content/uploads/2018/08/eDnsTest.20180810.zip

  6. January 01st, 2018 Week 01st Monday

    Life's like a movie, write your own. Keep believing, keep pretending. 人生如同电影,书写自己的结局.持续相信,继续演出. Some ...

  7. 【Alpha 冲刺】 4/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 已完成 会遗漏一些部分的api,但是通过群里询问以及对页面的review解决 孙浩楷 根据UI设计, 实现左侧 ...

  8. [提权]域内提权神器 MS14-068 完整EXP

     可以让任何域内用户提升为域管理员     c:\python27\python.exe ms14-068.py -u k8test3@k8.local -p k8team!@# -s S-1-5-2 ...

  9. [pip] pip命令的安装、卸载、查找方法汇总

    比如以selenium的为例 1.打开命令窗口(如果是win10,最好是通过管理员方式打开命令窗口,否则会出现安装时提示访问不拒绝) 2.安装selenium的指定版本,命令:pip install ...

  10. nginx之location.md

    安装echo模块 下载模块 # pwd /root # git clone https://github.com/openresty/echo-nginx-module 重新编译 先查看版本,然后根据 ...