随便记一下吧
1.用fungus搞出了头顶气泡对话
其实还是用的unity自带的canvas特性,调成了world space模式这种模式下canvas就和普通的 3D 物体一样了,可以控制位置大小等
目前是先普通地新建一个对话框(使用九宫格切割对话框,设置边界),移动成要绑定对象的子物体,把canvas改成world space模式,再调整panel的scale缩放(0.005不错)、图层,移动到相应位置
在panel上添加Vertical layoutGroup 和content size fitter,如图设置,使气泡大小自适应文本长度
一定要记得把子物体中这两关掉!不然没用!
tips:调整panel的anchors(锚点)可以控制对话框向左还是向右还是由中心延伸
效果如上,但npc对话怎么办呢,难道每个物体都绑一个,太麻烦了吧……感觉可以学一下头顶血条的方法?
角色转向对话框也会转的解决方法
和触发对话放一起了,获得角色位置,update更新(没有更优雅的办法吗?也许可以直接改sayDialog的代码……)
public class DialogTrigger : MonoBehaviour, IInteractable
{
public Flowchart flowchart;//对话
public GameObject box;//对话框
public Transform playerTrans;//角色位置
[Header("Block名称")]
public String blockName;
private void Update() {
box.transform.localScale = playerTrans.localScale;//让气泡的方向一直是正的
}
public void TriggerAction()
{
// flowchart = GameObject.Find("Flowchart").GetComponent<Flowchart>();//自动找Flowchart
Debug.Log("触发对话");
if (flowchart.HasBlock(blockName)){
// box.transform.position = playerTrans.position;//如果把气泡移到外面,就在触发对话时把气泡的位置移到角色头顶,但这样对话时移动气泡就不会动了
flowchart.ExecuteBlock(blockName);
}
}
}
对话时停止玩家操作的办法
在playerControl中,使用fungus自带的对话开始/结束时的接口,在开始/结束时控制输入系统
private void OnEnable() {
BlockSignals.OnBlockStart += OnBlockBegin;//fungus中对话开始时执行的方法
BlockSignals.OnBlockEnd += OnBlockEnd;
}
private void OnDisable() {
BlockSignals.OnBlockStart -= OnBlockBegin;
BlockSignals.OnBlockEnd -= OnBlockEnd;
}
//对话时停止玩家操作
private void OnBlockBegin(Block block)
{
isTalk = true;
Debug.Log("开始对话");
inputControl.GamePlay.Disable();//对话时停止输入系统中的玩家操作
}
//对话结束时恢复玩家操作
private void OnBlockEnd(Block block)
{
isTalk = false;
Debug.Log("结束对话");
inputControl.GamePlay.Enable();//对话结束时启动输入系统中的玩家操作
}
还有menu的方法,也许以后会用到
MenuSignals.OnMenuStart += OnMenuStart;
MenuSignals.OnMenuEnd += OnMenuEnd;
//例
public void OnMenuStart(MenuDialog menu)
{
// 默认选中第一个选项
menu.CachedButtons[0].Select();
}