unity项目过程中本菜新遇到的问题和解决方案

试出了奇怪的效果,还挺好看?

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文件夹后面的那些就行。直接传入路径参数的话需要写完整

2.此处无需.bytes 

直接读路径的这里这里却一定要带.moc

显示live2d模型

public class live2dmodel : MonoBehaviour {

	//贴图数组
	public List<Texture2D> 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<Texture2D> texture2Ds = new List<Texture2D>();
	//模型文件
	public TextAsset modelFile;
	//模型对象
	private Live2DModelUnity live2DModel;
	//live2d画布的位置,为了显示图像
	private Matrix4x4 live2DCanvasPos;


	//动作对象
	private List<Live2DMotion> live2DMotions = new List<Live2DMotion>();
	//动作文件
	public List<TextAsset> motionFiles = new List<TextAsset>();
	//动作管理队列,需要几个动作同时播放就需要几个动作管理者
	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<Texture2D> texture2Ds = new List<Texture2D>();
	//模型文件
	public TextAsset modelFile;
	//模型对象
	private Live2DModelUnity live2DModel;
	//live2d画布的位置,为了显示图像
	private Matrix4x4 live2DCanvasPos;


	//动作对象
	private List<Live2DMotion> live2DMotions = new List<Live2DMotion>();
	//动作文件
	public List<TextAsset> motionFiles = new List<TextAsset>();

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

眨眼功能

 updates里

跟随鼠标的话,那段多动作控制转化的代码记得删除。。。不然不兼容 

public class live2dmodel : MonoBehaviour {

	//贴图数组
	public List<Texture2D> texture2Ds = new List<Texture2D>();
	//模型文件
	public TextAsset modelFile;
	//模型对象
	private Live2DModelUnity live2DModel;
	//live2d画布的位置,为了显示图像
	private Matrix4x4 live2DCanvasPos;


	//动作对象
	private List<Live2DMotion> live2DMotions = new List<Live2DMotion>();
	//动作文件
	public List<TextAsset> motionFiles = new List<TextAsset>();
	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<Texture2D> texture2Ds = new List<Texture2D>();
	//模型文件
	public TextAsset modelFile;
	//模型对象
	private Live2DModelUnity live2DModel;
	//live2d画布的位置,为了显示图像
	private Matrix4x4 live2DCanvasPos;


	//动作对象
	private List<Live2DMotion> live2DMotions = new List<Live2DMotion>();
	//动作文件
	public List<TextAsset> motionFiles = new List<TextAsset>();
	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就行

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值