2014-05-11 01:24:57 u012856866 阅读数 499

和其他的3D软件一样,Unity3D作为一个类播放器的3D集成软件,具有良好的时间层级关系。比如Start()里面的语言,总是在播放器初始化时执行一次,而后就不再执行。例如下面用JS写的一个例子。在菜单栏上选中 38.JPG ——> 39.JPG ——> 40.JPG ,将下面这段代码拖拽给Hierarchy【层次清单栏】中任意一个对象。
41.JPG
您就会在播放器刚开始播放的时候,在左下角的控制台面板中看到 42.JPG 这句话,证明您的Game播放器已经开始工作了。如图5.1所示:

43.JPG
图5.1
(注:这个控制台买那般以后在大家使用的时候会经常用到它,因为它可以用作您代码片段的调试,以及您程序出错了的提示框,详细的提示您出错的原因所在。)
当然有了初始化函数,就一定会有刷帧函数Update(),该函数内所有的代码会在播放器每播放一帧时执行。例如下面用JS写的一个例子,在菜单栏上选中 未命名.JPG ——> 未命名2.JPG ——> 未命名3.JPG ,输入如下代码:
44.JPG
该代码会在播放器每播放一帧的时候,显示游戏开始到现在所消耗的时间值。
Unity3D中有着非常强大的接口处理功能,您可以在代码中为对象制定任意一个空接口用于和对应类型的对象进行交互,例如下面用JS写的一个例子,在菜单栏上选中 未命名.JPG ——> 未命名2.JPG——> 未命名3.JPG ,输入如下代码:

45.JPG
该代码为对象添加了一个在Z轴方向上的初始速度,如果在没有其他外力的作用下,物体将一直沿着Z轴方向以5的速度运动。并且当您将这段代码拖拽给一个物体对象后,它的这个初始速度可以作为一个接口在它的属性面板中进行修改。如图5.2所示:
46.JPG
图5.2
除了数字作为接口外,接口还可以是对象,例如下面用JS写的一个例子,在菜单栏上选中 未命名.JPG ——> 未命名2.JPG ——> 未命名3.JPG ,输入如下代码:
47.JPG
您可以将这段代码拖拽给Hierarchy【层次清单栏】中任意一个对象,因为它在这里定义了一个Transform类接口对象cubeGO,所以它几乎与拖拽的对象无关。拖拽成功之后来到该物体的属性面板中,您可以看到这样一个属性卷展栏 48.JPG,cubeGO的后面有个很明显未定义对象填写栏 49.JPG ,然后我们把想要使之运动的物体拖拽到这个上面来,当我们运行游戏时,只要按下“G”键就可以看到被拖拽的物体作为“cubeGO”的指代对象,朝着Z轴方向运动了。

Unity3D中的C#Script编程的注意事项

也许您在学习Unity3D之前,已经是一位C#的编程高手了。但在Unity3D中的C#并不像真正的C#那般强大,在Unity3D的C#中必须全部继承自MonoBehaviour。下面为一段C#Script的完整代码:
1.JPG
除此之外它不支持空间命名,但官方说他们很有可能会在以后的版本中支持这一功能。
在Unity3D中,JavaScript和C#Script的编程效果近乎一样。只是为了不同程序爱好者设立了不同的编程模式。并且JavaScript所编写的代码对象可以和C#Script编写的代码对象交叉使用,并不发生任何冲突。

修改MonoDevelop编辑器为Unity3D的默认编辑器

通常情况下Unity3D默认的编辑器都是“UniSciTE”,它用起来十分轻巧快捷,就像记事本一样。
但如果要开发一些大型的项目, 显然“UniSciTE”简单的功能就不足以支撑它的工作了。但如果您每次在编辑脚本的时候,都去用“MonoDevelop”一个个的打开,又会显得很 麻烦。所以我们就要在Unity3D中做一些设置,让“MonoDevelop”成为默认的脚本编辑器。具体的步骤是:在菜单栏中找到 2.JPG ——> 3.JPG ,在弹出的 未命名.JPG 对话框中找到 4.JPG 并将它后面的下拉框选中为 5.JPG ,浏览到我们“MonoDevelop”可执行文件存放的地方。这个路径一般都和您的Unity3D文件夹在一起。
设置好之后,重新再Unity3D中点选脚本文件,就会发现已经能用“MonoDevelop”软件打开了,但一次打开的时候会稍显慢一点,因为“MonoDevelop”需要加载很多东西。
当然,如果您是一个C#和Visual Studio忠实的编程爱好者,您也可以用同样的方法来设置Visual Studio软件的路径,让Visual Studio成为您Unity3D脚本的默认编辑器。

2014-09-15 16:36:11 jiangyongyuan 阅读数 140

Unity3D学习笔记——组件之Effects(效果/特效)——Particle System(粒子系统) - 有情怀的人

Effects: 效果/特效。

Particle System: 粒子系统。可用于创建烟雾、气流、火焰、涟漪等效果。

在Unity3D 3.5版本之后退出了新的shuriken粒子系统: 

 

添加组件之后的效果: 

   

其中的Open Editor按钮可以打开粒子编辑器,用于编辑复杂的粒子效果。

由于shuriken粒子系统是模块化的管理方式,所以可以动态的添加模块:

1.初始化模块:此模块是效果组件固有的模块。

Duration:粒子发射器,发射粒子的时间。单位为S(秒)。

Looping:是否开启。如果开启了循环,Duration值只要大于最小值0.10即可。

Prewarm:是否开启预热。只有在开启的循环的时候,预热才有效果,粒子量相似发射了一个粒子周期。

Start Delay:预热延迟。游戏开始多长时间后,预热开启。单位为S。 

Start Lifetime:粒子从发射器出来,到消失的时间。单位为S。 

Start Speed:粒子发射的速度。

Start Size:粒子大小。

Start Rotation:粒子的旋转角度。

Start Color:粒子的颜色。

Gravity Multiplier:设置重力对粒子的影响,数值越大影响越大。

Inherit Velocity:速度继承。当粒子系统是运动的时候,粒子的速度会继承运动的速度。但粒子坐标系必须在世界坐标系。 

Simulation Space:坐标系是本身还是世界坐标系。

Play On Awake:在游戏开始播放,但不影响Start Delay效果。

Max Particles:粒子释放的最大数量,当达到最大数量时,停止释放粒子,当有粒子消失时继续释放。

2.Emission Module(粒子发射模块)用于粒子发射的速率。或是某个特定时间发射大量的粒子,用于模拟爆炸的效果。

每秒发射粒子数量。Bursts为某个时间点爆发出粒子的数量,这个时间必须在粒子Duration范围内。

每米发射粒子数量。粒子发射器所在的游戏对象,移动的时候每米发射的粒子,但粒子坐标系必须在世界坐标系。

3.Shape Model(形状控制模块):定义了粒子发射器的形状,位置及发射方向。

球形粒子发射器:

Radius:球形的半径。

Emit from Shell:是否从表面发射粒子,还是从内部发射。

Random Direction:是否启用随机速度。

半球发射器:

锥体发射器:

Angle:椎体,上边开口的大小。

Radius:半径的大小。 

Length:椎体的高度。只有当Emit from 值为Volume Shell或是Volume时可用。

Emit From:粒子发射的位置。

——————Base:粒子发射源在椎体的内部的底面上,由底面开始发射。

——————Base Shell:粒子发射源在椎体底面的边缘,就是周长那一圈发射。

——————Volume:粒子发射源在椎体内部空间。

——————Volume Shell:粒子发射器在椎体整个表面上。没有底面。

立方体发射器:

Box X:立方体长度。

网格发射器:

Mesh:选择网格样式。

——————Vertex:粒子将从网格顶点发射。

——————Edge:粒子将从网格边缘(棱)发射。

——————Triangle:粒子将从网格的三角面发射。图形都是三角形组成的。

4.生命周期速度模块:控制每一个粒子的速度。

5.生命周期速度限制模块:

Separate Axis:是否启用限制每一个轴。

Speed:限制的速度。

Dampen:阻尼。阻尼为1的时候表示在生命周期结束的时候,速度降到限定的速度。

6.生命周期作用力模块:控制每一个粒子在生命周期内受到力的情况。

Randomize: 只有在 Random Between Two Constants或Random Between Two Curves时才可启用。

表示每一帧作用在粒子上的力是均匀随机产生的。 

7.生命周期颜色模块:控制每一个粒子在生命周期内颜色的变化。

8:速度范围颜色变化控制模块:根据设置速度的范围和粒子的速度来改变粒子的颜色。

9:生命周期粒子大小模块:控制每个粒子在生命周期内,大小的变化。

10: 速度范围粒子大小变化控制模块:根据速度的变化改变粒子的大小。

 

11:生命周期每个粒子的旋转速度:每秒粒子旋转的角度。

12:根据速度变化改变粒子的旋转速度:旋转速度不为固定常数时。

13:外部作用力倍增数:调整风对粒子的影响情况。

14:碰撞模块:为粒子创建粒子碰撞效果,目前只支持平面碰撞。

平面碰撞只支持6个平面,点击+号可以添加现在有的平面或是新建立一个。

通过新建立了碰撞平面,会成为粒子物体的子物体。

  Visualization:碰撞平面的显示方式。

——————Grid:  

——————Solid: 

Scale Plane:碰撞平面的大小。

Dampen:阻尼系数。粒子速度撞击损耗程度。0~1。

Bounce:反弹系数。0~2.系数越大,反弹角度越小。

Min kill Speed:最小销毁速度。当速度小于这个值的时候,粒子消失。

Particle Radius:粒子碰撞半径。最小值为0.01。

世界碰撞:

Collides With:碰撞层级。选择与那一层级碰撞。

Collision Quality:碰撞质量。

——————High: 每个粒子会每帧与场景做一次射线碰撞检测,需要注意的是,这样会增加CPU的负担,故在此情况下整个场景中的粒子数应当小于1000。

——————Medium: 粒子系统在每帧会受到一次Parude Raycast Budget全局设定的影晌。

——————Low: 与 中等效果相似 ,只 是粒子系统每4帧才受一次Parude Raycast Budget全局参数的影晌。

 —————— Voxel Size:碰撞缓存中的体素的尺寸,仅当Collision Quality为Medium和Low时可用。

15:子粒子发射模块:在粒子出生,碰撞,消灭时可以调用其他粒子。

   

  

  16:序列帧动画纹理模块:

Tiles:x水平分割的份数,y垂直分割的份数。

Animation:Whole Sheet-整个页面即X,Y一起移动。

Frame over Time:生命周期内,动画变幻的速率。

Cycles:生命周期内变化几次动画。

Animation:Single Row-从左到右行滚动。

Random Row:随机行。

Row:选择某一行,开始滚动,小于Tiles中的Y。

17:粒子的渲染模块:

Render Mode:渲染模式。

——————Billboard:面板渲染。

——————Vertical Billboard垂直渲染,此模式当面对摄像机时,粒子将与zX平面对齐

——————Horizontal Billboard :水平模式,此模式下粒子将沿Y轴对齐。

——————Stretched Billboard:拉伸渲染。

————C ameraScale:相机缩放。摄像机的速度对于粒子伸缩影晌的程度。speed Scale:通过比较粒子的速度决定粒子的长度。 LengthScale:通过比较粒子的宽度决定粒子的长度。

——————Mesh:模式。

18:属性:

Resimulate:实时渲染。在改变参数的时候,场景中的粒子效果实时变化。

Wireframe:选择时,将显示粒子的片面网格。

Trail Renderer

Line Renderer

Lens Flare

Halo

Projector

Legacy Particles

2013-05-04 21:29:47 iteye_20251 阅读数 216

在游戏开发过程中,会碰到游戏界面中的GUI控件太多,超出了屏幕的显示范围,此时就需要使用Scroll View控件来完成它的展示效果。

Scroll View控件可以设定一个滚动显示区域。如果水平或垂直的GUI控件超出其显示区域,视图下方或者右方将会出现滚动条。在开发中使用Scroll View控件的情况非常普遍,比如游戏中帮助信息或关于信息过长,就可以使用滚动条来查看相关信息。

 

下面说明Scroll View

控件的用法,代码如下:

  #pragma strict
  
  //定义存储滚动条的位置变量
  var scrollPosition:Vector2;
  
  function Start () {
  	//初始化滚动条位置
  	scrollPosition[0] = 50;
  	scrollPosition[1] = 50;
  }
  
  function OnGUI () {
  	//开始滚动视图
  	scrollPosition = GUI.BeginScrollView(Rect(0,0,200,200),scrollPosition,Rect(0,0,Screen.width,300),true,true);
  	
  	GUI.Label(Rect(100,40,Screen.width,30),"测试滚动视图内容测试滚动视图内容测试滚动视图内容测试滚动视图内容测试滚动视图内容测试滚动视图内容");
  	
  	//结束滚动视图
  	GUI.EndScrollView();
  }

 

 

上述代码中,Start()方法用于设置默认情况下滚动条的位置,数组scrollPosition[0]表示滚动视图水平滚动滑块位置,数组scrollPosition[1]表示滚动视图垂直滚动滑块位置。将这两个数组全部存储在Vector2中,拖动滚动条后,在程序内存中会动态修改两个滚动条的位置。GUI.BeginScrollView()方法用于开始滚动视图,该方法的第一个参数用于设置滚动显示视图的位置,第二个参数用于设置滚动条的起始位置,第三个用于设置滚动整理显示范围(注意:滚动视图的显示范围必须小于游戏视图整体范围),第四个参数与第五个参数为true时,表示内容超过滚动显示范围后显示滚动条,否则不显示滚动条。

注意:GUI.BeginScrollView()方法与GUI.EndScrollView()方法必须成对出现,否则程序会抛出异常。

运行程序后看到的结果如下图所示:

 

<!--EndFragment-->

 

 

<!--EndFragment-->
2016-11-06 21:46:52 sgnyyy 阅读数 638

在Java中的代码

public class Player {

	public int index = 12321321;
	public void GetTest()
	{
		Log.v("Unity", "setListener(1)!------------");
	}
}

        activity.Call<AndroidJavaObject>("Test").Call("GetTest");

        int index = activity.Call<AndroidJavaObject>("Test").Get<int>("index");
        UnityEngine.Debug.LogError("index : === " + index);

可以看到当返回AndroidJavaObject的话,还可以继续通过这个对象继续往下调用里面的方法和变量

2016-09-26 21:44:11 Fredomyan 阅读数 2645

一、需求

  1. 呈现3D效果(2D素材)选择角色效果
  2. 滚动保证层级,缩放比例,间距正常跟随
  3. 循环滚动
  4. 这个界面需求一般也会有游戏会采用(貌似有挺多)

二、核心实现

实现技术关键点
1. 如何控制每个Item之间的间隔(位置),缩放比例,差值平滑
2. 如何实现item层级关系正确显示(“离” 屏幕近的层级高)
3. 如何实现循环滚动

下面一一讲述当前Demo采用的方法
说到实现的核心,需要知道Unity3D中提供的一个叫做AnimationCurve的组件,这个不仅仅是表面上美术可以使用的组件,也不只是单纯的动画曲线的概念,当然它就是动画曲线,但是我们可以赋予AnimationCurve不同的意义,则可以借助Curve实现不同的功能,(AnimationCurve定义了一个变化趋势或者曲线,在不同的时间点,我们可以得到当前时间点下该曲线对应的y轴信息,这个信息可以是角色跳跃的高度,模型缩放的一个系数,摄像机距离目标的长度,一个角色当前的心情数值等等,曲线可以表示很多的意义)
没用过AnimationCurve的朋友,直接去官网看下介绍就明白如何使用
下面简单说下使用AnimationCurve可以完成的一些功能(上面已经介绍了一部分场景)
1. 角色2D跳跃
2. 摄像机移动
3. 角色心情指数
4. 缩放系数
5. 距离系数
6. ……

我们也赋予AnimationCurve不同的意义,实现我们核心目标(控制位移,控制缩放 当然也可以控制层级)

控制位移,缩放(3D效果的关键),差值过度动画平滑

  1. 创建两个AnimationCurve一个是scaleAnimationCurve和positionXAnimationCurve,分别控制缩放和位移
  2. 时间流水线控制(我们把所有的Item设置好自己对应的时间流位置即可,每次只要一动时间流水线,然后从两个曲线内获得当前流水线对应的缩放系数,位移系数,然后设置item的位移和缩放即可)
    3.如何制作动画(这个其实就是简单的时间流水线的差值处理,一定时间时间流水值达到目标值即可)
    下面放上两张曲线截图和具体实现:

缩放曲线,控制缩放
缩放曲线

位移曲线,控制item的位移
位移曲线

“depth”曲线,用来控制item的层级关系
depth曲线

    /// 
    /// 缩放曲线模拟当前缩放值
    /// 
    private float GetScaleValue(float sliderValue, float added)
    {
        float scaleValue = scaleCurve.Evaluate(sliderValue + added);
        return scaleValue;
    }
    /// 
    /// 位置曲线模拟当前x轴位置
    /// 
    private float GetXPosValue(float sliderValue, float added)
    {
        float evaluateValue = positionCurve.Evaluate(sliderValue + added) * posCurveFactor;
        return evaluateValue;
    }

    public void UpdateEnhanceScrollView(float fValue)
    {
        for (int i = 0; i < listEnhanceItems.Count; i++)
        {
            EnhanceItem itemScript = listEnhanceItems[i];
            float xValue = GetXPosValue(fValue, itemScript.CenterOffSet);
            float scaleValue = GetScaleValue(fValue, itemScript.CenterOffSet);
            float depthValue = depthCurve.Evaluate(fValue + itemScript.CenterOffSet);
            itemScript.UpdateScrollViewItems(xValue, -depthValue * depthFactor, yFixedPositionValue, scaleValue);
        }
    }
    void Update()
    {
        if (enableLerpTween)
            TweenViewToTarget();
    }

    private void TweenViewToTarget()
    {
        mCurrentDuration += Time.deltaTime;
        if (mCurrentDuration > lerpDuration)
            mCurrentDuration = lerpDuration;

        float percent = mCurrentDuration / lerpDuration;
        float value = Mathf.Lerp(originHorizontalValue, curHorizontalValue, percent);
        UpdateEnhanceScrollView(value);
        if (mCurrentDuration >= lerpDuration)
        {
            canChangeItem = true;
            enableLerpTween = false;
            OnTweenOver();
        }
    }

控制层级

只有正确的层级控制,才能够保证”不穿帮”,上文也说过,也可以通过AnimationCurve做一个层级曲线,在当前item的时间下面该item的depth或者层级应该是多少,该demo采用的是比较粗暴的list排序方法,按照每个item距离”屏幕的远近”其实就是scale系数,判断哪个item在前,哪个在后面,当然也有些问题,如果距离相同,可能存在item相互打架的可能(这个可以通过控制scaleCurve进行控制)
该Demo使用的UITexture控制层级(其他的任何方式原理一样,只是处理对象不一样,用mesh实现,那就是z轴等等)
Demo项目已经采用AnimationCurve来管理层级直接根据当前曲线值设置对应的depth或者z轴数值即可
具体实现如下:

    // Set the item "depth" 2d or 3d
    protected override void SetItemDepth(float depthValue)
    {
        if (mTexture.depth != (int)Mathf.Abs(depthValue))
            mTexture.depth = (int)Mathf.Abs(depthValue);
    }

实现滚动循环

说道循环滚动,因为我们使用到了AnimationCurve,先天性的动画曲线会有三种模式一种是pingpong,loop,一种是clamp,其中我们需要的是LOOP,没听错这就是滚动循环的关键点(我们的缩放曲线,位移系数曲线从0到1的效果模拟完毕,如果我们继续向前增加时间流水值,那么进入到下一个曲线的时候,所有的item都会反过来进行采样曲线值,就能够巧妙的实现循环效果(缩放系数,位移系数))如果不理解的,可以自己设置一个AnimationCurve,研究下,下面截图示意:

代码部分只是需要知道,如果点击了一个Item将该item移动到中心对应的时间流应该往前或者往后走多少

    /// 
    /// 获得当前要移动到中心的Item需要移动的factor间隔数
    /// 
    private int GetMoveCurveFactorCount(float targetXPos)
    {
        int centerIndex = scrollViewItems.Count / 2;
        for (int i = 0; i < scrollViewItems.Count;i++ )
        {
            float factor = (0.5f - dFactor * (centerIndex - i));
            float tempPosX = positionCurve.Evaluate(factor) * posCurveFactor;
            if (Mathf.Abs(targetXPos - tempPosX) < 0.01f)
                return Mathf.Abs(i - centerIndex);
        }
        return -1;
    }

三、注意问题

  1. 制作曲线,记得保证0-1时间轴填充完毕,这样在进行循环处理的时候才不会出现偏差
  2. 额,如果自己用这种方法尝试的朋友,如果有问题,请仔细查看Demo中的参数即可……(主要就是曲线制作问题)

该Demo使用的NGUI,虽然笔者没有用过UGUI,我想任何一个界面Tools都可以通过该方法实现,因为共同点一样,只是层级处理,缩放处理有区别而已

四、实现效果

最终效果.png

最终效果

五、改进目标

该项目还有许多需要改进的地方,以后花时间继续完善
- 支持Editor模式下的编辑,不用运行即可查看效果(这个应该是最关键的功能)
- 支持偶数个Item进行滑动
- 支持Drag操作
- 支持和NGUI类似的DragScrollView和CenterOnChild功能
- 优化每个Item的层级设置算法效率
- 优化更新每个Item位置,缩放算法效率


六、 2016.9.26更新

  1. 支持偶数个对象逻辑
  2. Drag操作
  3. 支持点击recenter和滑动recenter功能
  4. 层级算法更新,修改成自定义曲线,灵活控制”层级”
  5. 缩放曲线更新,解决由于误差造成持续滑动造成的显示错误
  6. 支持UGUI,添加UGUI案例

七、工程地址

https://github.com/tinyantstudio/EnhancedScrollView

更新的实现代码,不在本博客中更新,只介绍实现原理,具体的实现,请跳转到github查看,谢谢


八、总结

所有的内容都讲述完毕,如果这篇文章能够帮助到您获得对看到结束的朋友有一个简单的启发,请支持下~,文中存在错误或者描述不清楚的也请指正,共同交流学习,最好的方法就是直接下载Demo,然后看下逻辑和动画曲线的设置参数。

Unity进阶 - 动画系统 - 导入设置

博文 来自: ios_song
没有更多推荐了,返回首页