试出了奇怪的效果,还挺好看?
canvas
background
text
在unity中打开的vs编辑器中没有代码提示 - 流星曳尾 - 博客园
这里我一开始不知道为啥text显示不出来,调成screen size才发现,是canvas方向反了。。。。
调了回来
关于文字模糊问题。应该把frontsize调大,缩放文字的话调节scale的值就好
发现输出游戏的画面非常非常小,最后整顿一通发现是canvas没有调成scale with sceen,草,引以为戒
【Unity3D教程】2021全新UGUI+NGUI入门到精通官方教程合集附源码(全套完结基础/C#U3D/Unity 3D/游戏开发/课程/引擎)B0031_哔哩哔哩_bilibili
在spirit editor中进行这样分割后绿色框的外面不变形
rawImage与image区别:
rawImage图像源是texture格式,可以绑定所有图片,不仅是spirit
可以通过其达到动画效果
渐入、数字切换
描边组件(rawimage、image)outline
阴影组件 shadow
inspector面板可以锁上
live2d
读取live2d模型。支持以二进制文件参数或者moc3文件路径读取
细节注意:
1.此处路径只用写Resources文件夹后面的那些就行。直接传入路径参数的话需要写完整
显示live2d模型
public class live2dmodel : MonoBehaviour {
//贴图数组
public List texture2Ds;
//模型文件
public TextAsset modelFile;
//模型对象
private Live2DModelUnity live2DModel;
//live2d画布的位置,为了显示图像
private Matrix4x4 live2DCanvasPos;
// Use this for initialization
void Start () {
//初始化live2d环境
Live2D.init();
//从模型文件加载模型对象
live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);//获取bytes文件的bytes数组
//设置贴图
LoadTexture2D();
//指定显示位置与尺寸
float modelWidths = live2DModel.getCanvasWidth();
//参数固定 使用正交矩阵
live2DCanvasPos = Matrix4x4.Ortho(0, modelWidths, modelWidths, 0, 50, -50);
//正交视图的左右下上、近视口远视口
}
// Update is called once per frame
void Update () {
//将矩阵与模型联系,更新位置
live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);
//更新顶点、参数、贴图等等模型的所有信息
live2DModel.update();
}
//Unity中一个固定生命周期的函数
//绘图
private void OnRenderObject()
{
live2DModel.draw();
}
//贴图与模型建立联系
void LoadTexture2D()
{
for(int i = 0; i < texture2Ds.Count; i++)
{
live2DModel.setTexture(i, texture2Ds[i]);
}
}
}
live2d播放动作
先实例化动作对象,动作管理播放动作对象
public class live2dmodel : MonoBehaviour {
//贴图数组
public List texture2Ds = new List();
//模型文件
public TextAsset modelFile;
//模型对象
private Live2DModelUnity live2DModel;
//live2d画布的位置,为了显示图像
private Matrix4x4 live2DCanvasPos;
//动作对象
private List live2DMotions = new List();
//动作文件
public List motionFiles = new List();
//动作管理队列,需要几个动作同时播放就需要几个动作管理者
private MotionQueueManager motionQueueManager = new MotionQueueManager();
private MotionQueueManager motionQueueManagerA = new MotionQueueManager();
public int motionIndex = 0;
void Start () {
//初始化live2d环境
Live2D.init();
//从模型文件加载模型对象
live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);//获取bytes文件的bytes数组
//设置贴图
LoadTexture2D();
//指定显示位置与尺寸
//获取模型canvas尺寸
float modelWidths = live2DModel.getCanvasWidth();
//参数固定
live2DCanvasPos = Matrix4x4.Ortho(0, modelWidths, modelWidths, 0, 50, -50);
//播放动作
//实例化动作对象
LoadMotions();
//设置某一个动作动画的一些属性
live2DMotions[0].setLoop(true);//动作是否重复播放
live2DMotions[0].setLoopFadeIn(true);//重复播放是否进行渐变效果
live2DMotions[0].setFadeOut(1000);//设置淡出时间ms
live2DMotions[0].setFadeIn(1000);//设置淡入时间ms
motionQueueManager.startMotion(live2DMotions[0]);
motionQueueManagerA.startMotion(live2DMotions[5]);
}
// Update is called once per frame
void Update () {
//将矩阵与模型联系,更新位置
live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);
将动作与模型关联
motionQueueManager.updateParam(live2DModel);
motionQueueManagerA.updateParam(live2DModel);
//更新顶点、参数、贴图等等模型的所有信息,建议放在update方法最末尾
live2DModel.update();
}
//Unity中一个固定生命周期的函数
//绘图
private void OnRenderObject()
{
live2DModel.draw();
}
//贴图与模型建立联系
void LoadTexture2D()
{
for(int i = 0; i < texture2Ds.Count; i++)
{
live2DModel.setTexture(i, texture2Ds[i]);
}
}
void LoadMotions()
{
for (int i = 0; i < motionFiles.Count; i++)
{
live2DMotions.Add(Live2DMotion.loadMotion(motionFiles[i].bytes));
}
}
}
live2d多动作播放有一个优先级的概念。如果新动作优先级大于现在在播放的动作,会打断直接播放新动作。如果小于等于,会先播放完现在动作再进行新动作。
using UnityEngine;
using live2d;
using live2d.framework;
public class live2dmodel : MonoBehaviour {
//贴图数组
public List texture2Ds = new List();
//模型文件
public TextAsset modelFile;
//模型对象
private Live2DModelUnity live2DModel;
//live2d画布的位置,为了显示图像
private Matrix4x4 live2DCanvasPos;
//动作对象
private List live2DMotions = new List();
//动作文件
public List motionFiles = new List();
public int motionIndex = 0;
//创建优先级动作需要用这个而不是MotionQueueManager
private L2DMotionManager l2DMotionManager = new L2DMotionManager();
//优先级设置标准注释{}
void Start () {
//初始化live2d环境
Live2D.init();
//从模型文件加载模型对象
live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);//获取bytes文件的bytes数组
//设置贴图
LoadTexture2D();
//指定显示位置与尺寸
//获取模型canvas尺寸
float modelWidths = live2DModel.getCanvasWidth();
//参数固定
live2DCanvasPos = Matrix4x4.Ortho(0, modelWidths, modelWidths, 0, 50, -50);
//播放动作
//实例化动作对象
LoadMotions();
//设置某一个动作动画的一些属性
live2DMotions[0].setLoop(true);//动作是否重复播放
live2DMotions[0].setLoopFadeIn(true);//重复播放是否进行渐变效果
live2DMotions[0].setFadeOut(1000);//设置淡出时间ms
live2DMotions[0].setFadeIn(1000);//设置淡入时间ms
}
// Update is called once per frame
void Update () {
//将矩阵与模型联系,更新位置
live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);
l2DMotionManager.updateParam(live2DModel);
//判断待机动作
//返回true表示结束
if (l2DMotionManager.isFinished())
{
StartMotion(0, 1);
}
else if (Input.GetKeyDown(KeyCode.Space))
{
motionIndex++;
if (motionIndex >= live2DMotions.Count)
{
motionIndex = 0;
}
StartMotion(motionIndex, 2);
}
//更新顶点、参数、贴图等等模型的所有信息,建议放在update方法最末尾
live2DModel.update();
}
//Unity中一个固定生命周期的函数
//绘图
private void OnRenderObject()
{
live2DModel.draw();
}
//贴图与模型建立联系
void LoadTexture2D()
{
for(int i = 0; i < texture2Ds.Count; i++)
{
live2DModel.setTexture(i, texture2Ds[i]);
}
}
void LoadMotions()
{
for (int i = 0; i < motionFiles.Count; i++)
{
live2DMotions.Add(Live2DMotion.loadMotion(motionFiles[i].bytes));
}
}
private void StartMotion(int motionIndex,int priority)
{
int pri = l2DMotionManager.getCurrentPriority();
if (pri>=priority)
{
return;
}
else
{
l2DMotionManager.startMotion(live2DMotions[motionIndex]);
}
}
}
眨眼功能
跟随鼠标的话,那段多动作控制转化的代码记得删除。。。不然不兼容
public class live2dmodel : MonoBehaviour {
//贴图数组
public List texture2Ds = new List();
//模型文件
public TextAsset modelFile;
//模型对象
private Live2DModelUnity live2DModel;
//live2d画布的位置,为了显示图像
private Matrix4x4 live2DCanvasPos;
//动作对象
private List live2DMotions = new List();
//动作文件
public List motionFiles = new List();
private MotionQueueManager motionManager = new MotionQueueManager();
public int motionIndex = 0;
//自动眨眼
private EyeBlinkMotion blinkMotion = new EyeBlinkMotion();
//鼠标拖拽引起的动作变换
private L2DTargetPoint drag = new L2DTargetPoint();
//模型跟随鼠标转向与看向
private Vector3 pos;
void Start () {
//初始化live2d环境
Live2D.init();
//从模型文件加载模型对象
live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);//获取bytes文件的bytes数组
//设置贴图
LoadTexture2D();
//指定显示位置与尺寸
//获取模型canvas尺寸
float modelWidths = live2DModel.getCanvasWidth();
//参数固定
live2DCanvasPos = Matrix4x4.Ortho(0, modelWidths, modelWidths, 0, 50, -50);
//播放动作
//实例化动作对象
LoadMotions();
motionManager.startMotion(live2DMotions[0]);
//设置某一个动作动画的一些属性
live2DMotions[0].setLoop(true);//动作是否重复播放
live2DMotions[0].setLoopFadeIn(true);//重复播放是否进行渐变效果
live2DMotions[0].setFadeOut(1000);//设置淡出时间ms
live2DMotions[0].setFadeIn(1000);//设置淡入时间ms
}
// Update is called once per frame
void Update () {
//将矩阵与模型联系,更新位置
live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);
//眨眼
blinkMotion.setParam(live2DModel);
motionManager.updateParam(live2DModel);
pos = Input.mousePosition;
if (Input.GetMouseButton(0))
{
//涉及世界坐标与屏幕坐标转化
drag.Set(pos.x / Screen.width * 2 - 1, pos.y / Screen.height * 2 - 1);
}
else if (Input.GetMouseButtonUp(0))
{
drag.Set(0, 0);
}
//参数及时更新(考虑到加速度等自然因素),计算坐标,进行逐帧更新
drag.update();
//模型转向
if (drag.getX() != 0 || drag.getY()!=0)
{
live2DModel.setParamFloat("PARAM_ANGLE_X", 30 * drag.getX());
live2DModel.setParamFloat("PARAM_ANGLE_Y", 30 * drag.getY());
live2DModel.setParamFloat("PARAM_BODY_ANGLE_X", 10 * drag.getX());
live2DModel.setParamFloat("PARAM_EYE_BALL_X", drag.getX());
live2DModel.setParamFloat("PARAM_EYE_BALL_Y", drag.getY());
}
//更新顶点、参数、贴图等等模型的所有信息,建议放在update方法最末尾
live2DModel.update();
}
//Unity中一个固定生命周期的函数
//绘图
private void OnRenderObject()
{
live2DModel.draw();
}
//贴图与模型建立联系
void LoadTexture2D()
{
for(int i = 0; i < texture2Ds.Count; i++)
{
live2DModel.setTexture(i, texture2Ds[i]);
}
}
void LoadMotions()
{
for (int i = 0; i < motionFiles.Count; i++)
{
live2DMotions.Add(Live2DMotion.loadMotion(motionFiles[i].bytes));
}
}
}
头发飘动
public class live2dmodel : MonoBehaviour {
#region 变量定义
//贴图数组
public List texture2Ds = new List();
//模型文件
public TextAsset modelFile;
//模型对象
private Live2DModelUnity live2DModel;
//live2d画布的位置,为了显示图像
private Matrix4x4 live2DCanvasPos;
//动作对象
private List live2DMotions = new List();
//动作文件
public List motionFiles = new List();
private MotionQueueManager motionManager = new MotionQueueManager();
public int motionIndex = 0;
//自动眨眼
private EyeBlinkMotion blinkMotion = new EyeBlinkMotion();
//鼠标拖拽引起的动作变换
private L2DTargetPoint drag = new L2DTargetPoint();
//模型跟随鼠标转向与看向
private Vector3 pos;
//套用物理系统(物理运算的设定)
private PhysicsHair physicsHairSideLeft;
private PhysicsHair physicsHairSideRight;
private PhysicsHair physicsHairBackLeft;
private PhysicsHair physicsHairBackRight;
#endregion
void Start () {
//初始化live2d环境
Live2D.init();
//从模型文件加载模型对象
live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);//获取bytes文件的bytes数组
//设置贴图
LoadTexture2D();
#region 指定显示位置与尺寸
//获取模型canvas尺寸
float modelWidths = live2DModel.getCanvasWidth();
//参数固定
live2DCanvasPos = Matrix4x4.Ortho(0, modelWidths, modelWidths, 0, 50, -50);
#endregion
#region 播放动作
//实例化动作对象
LoadMotions();
motionManager.startMotion(live2DMotions[0]);
//设置某一个动作动画的一些属性
live2DMotions[0].setLoop(true);//动作是否重复播放
live2DMotions[0].setLoopFadeIn(true);//重复播放是否进行渐变效果
live2DMotions[0].setFadeOut(1000);//设置淡出时间ms
live2DMotions[0].setFadeIn(1000);//设置淡入时间ms
#endregion
#region 头发摇摆
physicsHairSideLeft = new PhysicsHair();
physicsHairSideRight = new PhysicsHair();
physicsHairBackLeft = new PhysicsHair();
physicsHairBackRight = new PhysicsHair();
//1:前发 0:后发
SetHair(physicsHairSideLeft,1);
SetHair(physicsHairSideRight,1);
SetHair(physicsHairBackLeft,0);
SetHair(physicsHairBackRight,0);
//设置输出表现
//输出表现的形式 根据角度 带V的意思是表现形式受到阻力的影响度以“V”函数图像形式变化
physicsHairSideLeft.addTargetParam(PhysicsHair.Target.TARGET_FROM_ANGLE, "PARAM_HAIR_SIDE_L", 0.005f, 1);
physicsHairSideRight.addTargetParam(PhysicsHair.Target.TARGET_FROM_ANGLE, "PARAM_HAIR_SIDE_R", 0.005f, 1);
physicsHairBackLeft.addTargetParam(PhysicsHair.Target.TARGET_FROM_ANGLE, "PARAM_HAIR_BACK_L", 0.005f, 1);
physicsHairBackRight.addTargetParam(PhysicsHair.Target.TARGET_FROM_ANGLE, "PARAM_HAIR_BACK_R", 0.005f, 1);
#endregion
}
void Update () {
//将矩阵与模型联系,更新位置
live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);
//眨眼
blinkMotion.setParam(live2DModel);
motionManager.updateParam(live2DModel);
#region 跟随鼠标
pos = Input.mousePosition;
if (Input.GetMouseButton(0))
{
//涉及世界坐标与屏幕坐标转化
drag.Set(pos.x / Screen.width * 2 - 1, pos.y / Screen.height * 2 - 1);
}
else if (Input.GetMouseButtonUp(0))
{
drag.Set(0, 0);
}
//参数及时更新(考虑到加速度等自然因素),计算坐标,进行逐帧更新
drag.update();
//模型转向
if (drag.getX() != 0 || drag.getY()!=0)
{
live2DModel.setParamFloat("PARAM_ANGLE_X", 30 * drag.getX());
live2DModel.setParamFloat("PARAM_ANGLE_Y", 30 * drag.getY());
live2DModel.setParamFloat("PARAM_BODY_ANGLE_X", 10 * drag.getX());
live2DModel.setParamFloat("PARAM_EYE_BALL_X", drag.getX());
live2DModel.setParamFloat("PARAM_EYE_BALL_Y", drag.getY());
}
#endregion
#region 更新头发物理
//第二个参数为计时器,环境搭建起来开始算起
physicsHairSideLeft.update(live2DModel, UtSystem.getUserTimeMSec());
physicsHairSideRight.update(live2DModel, UtSystem.getUserTimeMSec());
physicsHairBackLeft.update(live2DModel, UtSystem.getUserTimeMSec());
physicsHairBackRight.update(live2DModel, UtSystem.getUserTimeMSec());
#endregion
//更新顶点、参数、贴图等等模型的所有信息,建议放在update方法最末尾
live2DModel.update();
}
//Unity中一个固定生命周期的函数
//绘图
private void OnRenderObject()
{
live2DModel.draw();
}
//贴图与模型建立联系
void LoadTexture2D()
{
for(int i = 0; i < texture2Ds.Count; i++)
{
live2DModel.setTexture(i, texture2Ds[i]);
}
}
//导入动作
void LoadMotions()
{
for (int i = 0; i < motionFiles.Count; i++)
{
live2DMotions.Add(Live2DMotion.loadMotion(motionFiles[i].bytes));
}
}
void SetHair(PhysicsHair hair,int flag)//1: 前发 0: 后发
{
//套用物理运算
//模型系数在json文件里
if(flag==1)
hair.setup(0.2f, 0.5f, 0.14f);
else
hair.setup(0.24f, 0.5f, 0.18f);
/*参数:头发长度,影响摇摆周期
* 头发受到的空气阻力
* 头发质量
*/
//设置输入参数
//设置哪一个部分变动时进行物理运算
//横向摇摆效果
hair.addSrcParam(PhysicsHair.Src.SRC_TO_X, "PARAM_ANGLE_X", 0.005f, 1);
hair.addSrcParam(PhysicsHair.Src.SRC_TO_G_ANGLE, "PARAM_ANGLE_Z", 0.005f, 1);
//第三个参数为进行变动时头发受到的影响。json提供
//第四个参数为变化的影响幅度
}
}
有两个,一个是src一个是target。src是说哪一部分进行变动时会跟着变,target是说变的是哪一部分。
src有三个参数
SRC_TO_X 横向摆动
SRC_TO_G_ANGLE//SRC_TO_Y 下垂,不摆
target
TARGET_FROM_ANGLE
TARGET_FROM_ANGLE_V 带V的意思是表现形式受到阻力的影响度以“V”函数图像形式变化,会很快很快到达要变的位置,再停一下,再很快很快恢复
任务46 4:30左右,讲了怎么把一个图片设置成鼠标
提示信息 - SiKi学院 - 生命不息,学习不止!
用框架显示模型
Live2D Cubism SDK 3 for Unity 文档中文翻译_gtf35的博客-CSDN博客
OnMouseEnter突然无法触发:
这样改一下canvas就行