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游戏里有的功能 ...
随机推荐
- etc/skel目录介绍
/etc/skel目录的作用: /etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户家目录下,默认情况下,/etc/skel 目录下 ...
- C语言short int
因为C语言中short int占2个字节,有16个二进制位,共可表示2^16种状态.因为它用来表示有符号数,而0也要占用一个状态.所以,16位的原码可以表示的数是-32767~+32767,它的0可以 ...
- RecyclerView使用技巧(item动画及嵌套高度适配解决方案)
原文地址 · Frank-Zhu http://frank-zhu.github.io/android/2015/02/26/android-recyclerview-part-3/?utm_sou ...
- 安全之路 —— C/C++实现后门的服务自启动
简介 Windows NT系统后门要实现自启动,有许多种方法,例如注册表自启动,映像劫持技术,SVCHost自启动以及本章节介绍的服务自启动等方法,其中服务自启动相对于上述其他三种需要修改注册表的启动 ...
- [HZNOI #koishi] Magic
[HZNOI #514] Magic 题意 给定一个 \(n\) 个点 \(m\) 条边的有向图, 每个点有两个权值 \(a_i\) 和 \(b_i\), 可以以 \(b_i\) 的花费把第 \(i\ ...
- Oracle Spatial中SDO_Geometry说明
Oracle Spatial中SDO_Geometry说明 在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及 ...
- 敲代码非常难之logstash之file input插件实现分析
版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/25665877 ...
- 借助强大的IDEA开发ide高效实现equals,hashcode以及toString方法
IDEA工具提供多种生成hashCode与equals的代码方案,注意:尽量不要使用第一个方案,第一个方案对于null不做判空处理,容易NNP问题. 对于生成toString方法方案,默认使用的是+拼 ...
- ethereumjs/ethereumjs-util
ethereumjs/ethereumjs-util Most of the string manipulation methods are provided by ethjs-util 更多的字符串 ...
- java util.Date 转换为sql.Date
public static java.sql.Timestamp StrTransSqlDate(String date) { SimpleDateFormat simpleDateFormat = ...