Unity对话系统中如何检测当前语句并触发角色动画?
实现对话结束时播放对应动画的方案
你的代码里已经用Index变量记录了当前正在播放的句子索引,完全可以利用它判断当前语句,进而触发对应动画。下面是具体修改步骤:
1. 添加动画组件引用
在DialogueController类中添加公开的Animator变量,用来控制角色动画:
public TextMeshProUGUI DialogueText; public string[] Sentences; private int Index = 0; public float DialogueSpeed; bool collide = false; private bool nextText = true; // 新增:引用角色的Animator组件 public Animator characterAnimator;
2. 在对话结束时触发对应动画
修改WriteSentence协程,在句子播放完成(说话停止)时,根据刚播放完的句子索引(注意Index在循环结束后会自增,所以用Index-1获取当前完成的句子下标)播放对应动画:
IEnumerator WriteSentence() { // 可选:开始说话时切换到"说话中"动画 characterAnimator.SetBool("IsTalking", true); foreach(char Character in Sentences[Index].ToCharArray()) { DialogueText.text += Character; yield return new WaitForSeconds(DialogueSpeed); } // 说话停止,关闭"说话中"状态 characterAnimator.SetBool("IsTalking", false); // 根据刚播放完的句子索引,触发对应结束动画 int finishedSentenceIndex = Index - 1; switch(finishedSentenceIndex) { case 0: // 替换成你第1句结束的动画名称 characterAnimator.Play("Sentence1_EndAnim"); break; case 1: characterAnimator.Play("Sentence2_EndAnim"); break; case 2: characterAnimator.Play("Sentence3_EndAnim"); break; // 按你的句子数量继续添加case分支 } Index++; nextText = true; }
3. 处理全部对话结束的收尾动画
如果需要在所有对话说完后播放收尾动画,修改NextSentence方法:
void NextSentence() { if (Index <= Sentences.Length - 1) { DialogueText.text = ""; StartCoroutine(WriteSentence()); } else { // 所有对话完成,播放最终收尾动画 characterAnimator.Play("AllDialogue_FinishedAnim"); collide = false; // 关闭对话触发状态,避免重复触发 } }
动画设置注意事项
- 在Unity Animator窗口中,给角色创建对应动画状态:用
IsTalking布尔参数控制说话循环动画,各个SentenceX_EndAnim对应单句结束的动画,AllDialogue_FinishedAnim对应全部对话结束的动画。 - 将角色的Animator组件拖到
DialogueController的characterAnimator字段中。
内容的提问来源于stack exchange,提问作者user22436336
相关产品推荐
相关产品推荐

