2018-08-29 22:36:58 QQhelphelp 阅读数 2766

LineRender用于在3D世界中渲染线段。

首先创建空物体GameObject,添加组件LineRenderer.

添加如下脚本:

  1. public GameObject LineRenderGameObject;//GameObject空物体
  2.     public LineRenderer lineRender;//GameObject的lineRenderer组件
  3.     private int lineLength = 4;//顶点数量
  4.    //3D空间中的4个点
  5.     public Vector3 v0 = new Vector3 (1, 1, 0);
  6.     public Vector3 v1 = new Vector3 (2, 2, 0);
  7.     public Vector3 v2 = new Vector3 (3, 2, 0);
  8.     public Vector3 v3 = new Vector3 (4, 1, 0);
  9.  
  10.     void Start ()
  11.     {
  12.         LineRenderGameObject = GameObject.Find ("GameObject");//获取GameObject物体
  13.         lineRender = LineRenderGameObject.GetComponent<LineRenderer> ()as LineRenderer;//获取组件
  14.         lineRender.SetVertexCount (lineLength);//设置顶点数量
  15.         lineRender.SetWidth (0.1f, 0.1f);//设置宽度
  16.     }
  17.  
  18.     void Update ()
  19.     {
  20.        //设置顶点顺序,位置
  21.         lineRender.SetPosition (0, v0);
  22.         lineRender.SetPosition (1, v1);
  23.         lineRender.SetPosition (2, v2);
  24.         lineRender.SetPosition (3, v3);
  25.     }

运行就会出现四个顶点连城三条线段 。

2013-07-12 17:16:03 qqMCY 阅读数 1170



相关属性:

Cast Shadows:是否投射阴影。

Receive Shadows:是否接收阴影。

Materials:  设置材质,这里可以设置多个材质并且它们依次排开。

Positions:这个属性就比较重要了,它专门用于设置线段在3D世界中的坐标,其中Size与线段的数量保持一致,Element节点中就是每个线段点的位置。

Start Width :设置线段起点的宽度。

End Width:   设置线段终点的宽度。

Use World Space:使用世界坐标系。




2018-09-27 16:05:31 caozhaodan 阅读数 1223

我们使用Unity或者其他软件都有一个颜色选择功能,但是这个组件只能在编辑模式中用。因此我就自己开发了一个颜色选择器的插件。

在网上也看到其他人的实现方法,都大同小异,通过新建一张texture,再用代码在图片上渲染颜色。正好我刚刚学习了Shader Forge,所以就想着用shader来渲染颜色,也可以复习新学到的知识。
开发环境:Unity2017.1.0f3 ShaderForge1.38

实现初效果
实现初效果

界面使用UGUI开发,选择器分为三个模块,Saturation,Hue,Color。

Hue是 七色渐变图,实现多种颜色的选择。
Saturation是Hue选择的颜色的饱和度。
Color是最后选择的颜色。

下面是每个功能的逐个实现。

首先用UGUI创建界面,可以全部使用Image
在这里插入图片描述
Saturation大小是80,轴点放到左上角。创建子节点SatDot,大小为5。
Hue高80,宽10,轴点放到最上方居中。创建子节点HueDot,高为3,宽为10。

ShaderForge创建2D shader,命名为HueShader,节点图如下
Hueshader
HueShader自带有Hue节点,直接使用即可。因为Hue是从上到下,所以UV只需要V点的区域。

ShaderForge创建2D shader,命名为SaturationShader,节点图如下
SaturationShader

因为需要在Hue上选择的颜色,只要将HueDot的y坐标相对Hue的高度的比例传给Value。

ShaderForge创建2D shader,命名为ColorShader,节点图如下
在这里插入图片描述

Value是HueDot位置相对Hue的高度的比例(同上),u是SatDot的x坐标相对于Saturation的宽度的比例,v是SatDot的y坐标相对于Saturation的高度的比例。

shader创建完成,在创建3个材质球,将3个shader分别拖到材质球,把材质球对应给不同的Image。
下面就开始一些简单的C#代码实现颜色的选择。

首先SatDot要在Saturation范围内通过鼠标拖动可以上下左右移动,HueDot要在Hue范围内只能上下移动,不能左右移动。
创建C#脚本,将脚本挂到SatDot和HueDot。如下代码即可使鼠标拖动SatDot和HueDot。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DragDot : MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler
{
	public void OnDrag(PointerEventData eventData)
    {
		if(this.transform.parent.name=="Saturation"){
			Saturation (eventData.position);
		}else{
			Hue(eventData.position);
		}
    }
	public  void Saturation(Vector3 mousePos){
		this.transform.position = mousePos;
		if(this.transform.localPosition.x<0f){
			this.transform.localPosition = new Vector2 (0f, this.transform.localPosition.y);
		}
		if(this.transform.localPosition.x>80f){
			this.transform.localPosition = new Vector2 (80f, this.transform.localPosition.y);
		}
		if(this.transform.localPosition.y>0){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,0);
		}
		if(this.transform.localPosition.y<-80f){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,-80f);
		}
	}

	public void Hue(Vector3 mousePos){
		this.transform.position = new Vector2 (this.transform.position.x, mousePos.y);
		if(this.transform.localPosition.y>0){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,0);
		}
		if(this.transform.localPosition.y<-80f){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,-80f);
		}
	}
		
}

然后需要实现点击Saturation和Hue两个Image,两个Dot分别到点击的位置。
创建C#脚本,将脚本挂到Saturation和Hue。如下代码即可使SatDot和HueDot到鼠标点击位置。

using UnityEngine;
using UnityEngine.EventSystems;
public class ClickImage : MonoBehaviour ,IPointerClickHandler
{
	public DragPoint dragPoint;
	void IPointerClickHandler.OnPointerClick (PointerEventData eventData)
	{
		if(this.name=="Saturation"){
			dragPoint.Saturation (eventData.position);
		}else{
			dragPoint.Hue(eventData.position);
		}
	}
	

再新建一个脚本,可以使shader之间相互传值。

using UnityEngine;

public class ColorPicker : MonoBehaviour
{
	public Material satMat;
	public Material colorMat;
	
	public void GetHueColor(float hueValue){
		satMat.SetFloat ("_Value",hueValue);

	}

	public void GetSaturationColor(float x,float y,float hueValue){
		colorMat.SetFloat ("_Value",hueValue);
		colorMat.SetFloat ("_U",x);
		colorMat.SetFloat ("_V",y);
	}
}

最后,在DragDot 脚本中计算出拖动Dot时,Dot相对于父节点的比例,在调用GetHueColor方法和GetSaturationColor方法。

附上 完整的DragDot 的代码

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DragPoint : MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
		if(this.transform.parent.name=="Saturation"){
			Saturation (eventData.position);
		}else{
			Hue(eventData.position);
		}
    }

	public  void Saturation(Vector3 mousePos){

		if (this.name == "HueDot")
			return;

		this.transform.position = mousePos;
		if(this.transform.localPosition.x<0f){
			this.transform.localPosition = new Vector2 (0f, this.transform.localPosition.y);
		}
		if(this.transform.localPosition.x>80f){
			this.transform.localPosition = new Vector2 (80f, this.transform.localPosition.y);
		}
		if(this.transform.localPosition.y>0){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,0);
		}
		if(this.transform.localPosition.y<-80f){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,-80f);
		}

		float x = Mathf.Abs (this.transform.localPosition.x) / 80f;
		float y = Mathf.Abs (this.transform.localPosition.y) / 80f;
		//ColorPicker中创建单例
		//hueValue是在ColorPicker中初始换
		ColorPicker._instance.GetSaturationColor (x, y,ColorPicker._instance.hueValue);

	}

	public void Hue(Vector3 mousePos){
		this.transform.position = new Vector2 (this.transform.position.x, mousePos.y);
		if(this.transform.localPosition.y>0){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,0);
		}
		if(this.transform.localPosition.y<-80f){
			this.transform.localPosition = new Vector2 (this.transform.localPosition.x,-80f);
		}
		
		float rate = (Mathf.Abs(this.transform.localPosition.y)  - 2) / 80f;
		ColorPicker._instance.hueValue = rate;
		ColorPicker._instance.GetHueColor (rate);
		GameObject dot = GameObject.Find ("SatDot");
		dot.GetComponent<DragPoint> ().Saturation (dot.transform.position);
	}
		
}

PC、安卓完美实现。还有一些其他功能,后续开发中…

2018-03-16 18:22:34 cdkd123 阅读数 607

本篇是本人学习courera课程unity3d编程基础 课程笔记,想学习可以直接报名哦。文章版权归本人所有,转载请谨慎。

这次,我们要完成这2个效果:

  1. 我们创建一个小球 smallball, 一个大球bigball,一个方块,两个球都在方块上方。我们想让 bigball 掉下来砸向 smallball。最终,bigball掉落在
    方块上面,smallball 被挤下去。
  2. 给2个小球都设置木质材质,方块设置铁块材质。

首先,实现第1个效果:

打开 hierarchy 层级视图,我们创建一个小球 smallball, 一个大球bigball,一个方块,摆好位置,这里,我们想让 bigball 掉下来砸向 smallball。最终,bigball掉落在方块上面,smallball 被挤下去。

我们勾选大球 bigball RegistBody的 constraints 属性中 freeze position 与 freeze rotation 的 x z 选项 – 大球只能在 y 轴上运动与旋转。
这样做为了限制“大球“左右前后移动,只沿着垂直轴y移动。

点击预览按钮,就可以看到效果,大球掉落,把小球挤下去了!

图1
图1 大球挤掉小球

接着,我们给3个对象添加材质, project 视图 -> assets -> 鼠标右键,依次选择 create physic matelrial,创建一个物理材质,我们将其重命名为 wood 表示物理材质。

接下来在 project 视图中选中 wood 物理材质就可以在 inspector 检视视图中设置其属性。

我们将 wood 物理材质设置成大球 bigball 的物理材质: 拖拽到 collider 组件的 material 的属性中。

另外一个球和方块同样的方式设置:

图2

图2 修改对象物理材质

到此,完成开头的要求。

这篇,我们了解了:

  • “物理材质“的渲染组件;
  • “刚体RegistBody“的作用:模拟物理世界有质量的实物,产生力;还可以限制移动方向。
2017-08-02 15:20:22 shenmifangke 阅读数 3173


官方网站https://unity.otoy.com/

octane是GPU渲染器

貌似是昨天8月1号发布的

https://www.assetstore.unity3d.com/en/#!/content/96587

从这个例子看出直接支持vr输出

https://www.assetstore.unity3d.com/en/#!/search/page=1/sortby=relevance/query=publisher:30723

西部世界的片头就是octane render渲染的


以前宣传片上就能看到,等了好久,一度以为烂尾了

现在终于出现了

安装看样子需要unity2017版本以上

想先体验下的可以试试了


Unity3d LineRenderer画线

阅读数 11405

没有更多推荐了,返回首页