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);
}
}

}

}

原文地址:https://www.cnblogs.com/xiaoahui/p/10224818.html

时间: 2024-10-27 10:43:54

Unity角色对话的相关文章

Unity角色换装问题

游戏中经常涉及到角色换装问题. 1.装备模型中的每一套装备都必须使用同一套骨骼,把单个骨骼数据保存成Prefab,骨骼数据在Unity中以Transform形式存在 2.把模型中的每个部分都单独保存成prefab. 实现思路: 1.创建骨骼GameObject,把所有的装备蒙皮数据合并到一个prefab中. 2.创建装备GameObject,用来手机其中蒙皮数据,从而创建新的SkinedMeshRenderer. 收集信息代码 // Collect information from meshes

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

作者写游戏完成的时候,还需要从新想下如何把游戏设置重新开始,角色如何复活. 一般大多数都会采用这种方式来代替游戏重新开始 Application.LoadLevel("xxx场景") . 但是角色复活就必须完全靠自己写代码把组件换到特定的状态呀 重新游戏: Application.LoadLevel("xxx场景")   = 重新开始游戏 组件.还原初始化状态()  + 组件.还原初始化状态() + 组件.还原初始化状态()  + -.  =  重新开始游戏 角色复

Unity 角色场景传送功能

传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.SceneManagement; //玩家传送触发器及传送点public class StreetChanger : MonoBehaviour { public string sceneName;//传送的场景的名字 public float transTime;//传送等待的时间,比如在此时间内

unity assetStore 常用插件

类别 名称 说明 价格(20180723)  教程 Mecanim Example Scenes 官方示例场景.   Surivial Shooter     2D Platformer     2D UFO Tutorial     脚本     iTween 缓动动画插件.   DOTween 相比 iTween 功能更丰富,支持组合动画.富文本动画.搭配协程一起使用等. FREE / $12  Photon Cloud 和 Unity 自带的网络系统组合,可以轻松实现多人联网.Pro 版拥

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

一.建立一个XML文档,放在项目中Assert/Resources/XML文件下 XML的内容如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <dialogues1> 4 <dialogue> 5 <role>门派长老</role> 6 <detail>李清,你找我意欲何事?</detail> 7 </dialogue>

一款游戏如何诞生

就像我在成为一只游戏程序猿之前,完全无法想象一款游戏是如何诞生的,当初也只是觉得那并不是十分复杂的东西,如果你还未成为这个行业的一员,如果你还是一名在校学生,那么我想你也会和当初的我有一样的感受吧. 随着游戏行业竞争越来越激烈,每天都有很多的游戏面世,也有很多的游戏死亡,玩家被培养的越来越挑剔,渐渐觉得游戏开发很简单.其实我想说,这里面的水很深.不进入这个圈子,你是很难想象它是什么样子的.我就就自己的经历和感悟来大致的说一下一款游戏诞生的过程. 如果硬要把游戏开发流程分类的话,我觉得可以分为两类

Cocos2d-x 3.2 大富翁游戏项目开发-第二十九部分 游戏配音

我从大富翁里提取出来里面的wav音效文件,放到我们的游戏中以增加趣味性,仅供学习研究之用 1.修改AppDelegate.cpp文件 // This function will be called when the app is inactive. When comes a phone call,it's be invoked too void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stop

从沉浸感、心流两个维度评价一款游戏

转自:http://www.gameres.com/473493.html 说到游戏不得不提及电影,两者都是通过用户的移情来达到情感上的共鸣与高潮.Jon Boorstin在<The Hollywood Eye : What Makes Movies Work>就如何做一部好电影,抽象了三个维度的影响因子:visceral(本能的).vicarious(带入的).voyeur(窥视的). 本能维度:动作的兴奋.摧毁的快感.强烈的情欲.嗜血的杀戮.恐惧.反感,这些都属于用户的本能反应,或者称为“

图形化编程娱乐于教,Kittenblock实例,广播消息

跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关键的问题在于,带入感,我能给出的建议,就是咬咬牙,坚持住,没有学不会的知识.会陆续分享图形化编程的经验,希望能够做成一个专题.如果您觉得有用,就给点个赞吧.涉及的软件包括scratch3.0 (.sb3).Python.Kittenblock. 程序解读:两个角色对话. 知识点:广播消息. 涉及的软件:scratch3.0 (.sb3).Python.Kittenblo