2018-03-22 19:47:48 qq_40771473 阅读数 1020
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

关卡滑动最主要的是ScrollRect组件里的属性horizontalNormalizedPosition(页面水平滑动的值)和vertiacalNormalizedPosition(页面垂直滑动的值);这里我的项目是水平滑动。
 

horizontalNormalizedPosition的最小值是0,最大值是1;也就是说你的第一页是0,最后一页是1;这里需要注意的是如果你有四页,第二页不是0.25,需要你自己测试(就是程序在第二页的时候,去打印一下horizontalNormalizedposition就可以了)。

现在就开始我的项目:如果看项目文件,加我qq:23353677;

public class ScrollPage : MonoBehaviour,IBeginDragHandler,IEndDragHandler {
 
//滑动组件
public ScrollRect scrollRect;
 
//每一页滚动区域的定位坐标
public float[] posArr = new float[] { 0, 0.3333f, 0.666f, 1 };
 
//页码索引
public int pageIndex = 0;
 
//目标位置
public float targetPos;
 
//是否拖拽
public bool isDrag;
 
//单选按钮组
List<Toggle> toggles;
 
void Start () {
scrollRect = GetComponent<ScrollRect>();
toggles = new List<Toggle>();
this.GetComponentsInChildren<Toggle>(toggles);
//给每个单选按钮添加时间
foreach (var item in toggles) {
item.onValueChanged.AddListener(delegate(bool flag) {
//因为点击单选按钮时 会有两个按钮触发事件,所以要判断
if (flag) {
//把名字中的字母替换掉,只留数字,然后转化成int类型作为下标;
int index = int.Parse(item.name.Replace("p",""));
//更新目标位置
targetPos = posArr[index];
pageIndex = index;
}
});
}
}
 
void Update () {
if (!isDrag)
{
scrollRect.horizontalNormalizedPosition = Mathf.Lerp(scrollRect.horizontalNormalizedPosition,targetPos,Time.deltaTime*5);
}
}
 
public void OnBeginDrag(PointerEventData eventData)
{
isDrag = true;
}
 
public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
/*第一种方法
 
float curPos = scrollRect.horizontalNormalizedPosition;
//鼠标(滑条的水平值scrollRect.horizontalNormalizedPosition)和每个页码的距离最小,就去哪一页
//offset最小距离,先假设第一页和鼠标的距离差;
pageIndex = 0;
float offset = Mathf.Abs(curPos - posArr[pageIndex]);
for (int i = 1; i < posArr.Length; i++) {
float temp = Mathf.Abs(curPos - posArr[i]);
if(temp < offset)
{
offset = temp;
pageIndex = i;
}
}
//更新目标位置
targetPos = posArr[pageIndex];
//单选按钮为真
toggles[pageIndex].isOn = true;
 
*/
 
 
//第二种方法
 
float curPos = scrollRect.horizontalNormalizedPosition;
//根据当前和原始的位置差,是正是负,判断向左向右
//如果当前和原始的位置差小于一个值,就不改变当前的页码了
if (Mathf.Abs(curPos - targetPos) < 0.07f) { return; }
//正值右滑
if (curPos - targetPos > 0)
{
pageIndex = pageIndex + 1 > posArr.Length - 1 ? posArr.Length - 1 : pageIndex+1;
Debug.Log(pageIndex);
}
else {
pageIndex = pageIndex - 1 < 0 ? 0 : pageIndex-1;
}
 
targetPos = posArr[pageIndex];
toggles[pageIndex].isOn = true;
 
}
}
2016-09-30 16:50:12 u014687749 阅读数 3835
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

首先创建如下的UI关系:

其中每个Tollgate都是Image,选一个背景图片。

其中Panel的宽高设置为2000*230,然后每张图(Image)设置为500*230TopPanel设置为500*230,所以有四张图。


 

TopPanel添加ScrollRect组件和Mask组件。

ScrollRectContent拉进Panel作为显示的内容,把VerticalHorizontal不勾选

新建一个ScrollBar,拖进Hotinzontal scrollbar

 

下一部运行一下,看能不能拖动Scrollbar 横向改变显示内容。

可以的话就可以把Scrollbar隐藏掉,然后用脚本控制scrollbarValue值。

其中点击左右按钮,就动态改变Value值。

左右按钮记得绑定事件。

改变代码如下:

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

 

public class ScrollRectControl : MonoBehaviour {

 

public Scrollbar scrollbar;

private float scrollbar_TargetValue;

void Start ()

{

scrollbar_TargetValue = 0f;

}

void Update ()

{

if(scrollbar_TargetValue <= 0)

{

scrollbar_TargetValue = 0f;

}

if(scrollbar_TargetValue >= 0.99f)

{

scrollbar_TargetValue = 1f;

}

scrollbar.value = Mathf.MoveTowards(scrollbar.value,scrollbar_TargetValue,Time.deltaTime);

}

public void RightBtnPressed()

{

scrollbar_TargetValue += 0.33f;

}

public void LeftBtnPressed()

{

scrollbar_TargetValue -= 0.33f;

}

}

 

虽然这样做有个小Bug,就是图片不切合,有误差...本来算好是0.25不过误差较大,后面改为0.33也是还有无法消除的误差,这个应该是比例没算好。

 

结果是我把TopPanel的宽高修改为410*230后就OK,不过还是有点小问题咯,不能完全切合,不过将判断条件修改成0.99就可以了。

但是这样子看背景图就有点尴尬了,再稍微调整一下背景图和Tollgate按钮效果才可以比较好。

 

不过没关系,现在手机游戏一般都是通过计算手指拖动的距离来改变Value值,这就有思路实现手机上关卡滚动图拖动效果了吧。

 

 

 

2019-03-21 14:09:53 qq_38198562 阅读数 263
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

首先创建一个panel ui组件,在这个组件上添加 GridLayout Group

该组件实现了当创建level,并且将父物体设置为Grid后能够自动排版

level  的创建是 第一个是背景图 第二个锁定的图(这里是白色的,透明度很低),第三个是 第几关 ,第四个是

显示星个数,多创建几个level  ,记得选择一下你是水平分布还是垂直分布,这里我们是进行垂直分布。

记得将panel 的中心点  放到左边, 作用是  当把panel进行扩张的的时候,默认是中心点然后向左右扩张,放到左边 则只会向you'右边扩张。

创建完panel  在创建一个panel并把它命名为scrollpanel,大小调整为你想内容展示的范围。在此上添加组件 ScrollRect  组件 ,这样才可以滑动,在把要滑入的内容挂载在content上,

之后发现 内容会超出 这个时候我们再在ScrollRect 添加mask组件 这样超出的范围就不会显示。

然后在此上添加脚本,命名为A_page,content 代表要滑动的部分,即panel


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class A_page : MonoBehaviour,IBeginDragHandler, IEndDragHandler
{
   

  private ScrollRect rect;//获取当前挂载物体的scrollrect
  //  private float[] pageArray= new float[] { 0, 0.5f, 1 };
  private List<float> pageArray = new List<float>();
    private float targethorizontal;
    public float smoothing = 3;//敏捷度
    private bool isDrag = false;//是否拖拽
    public RectTransform content;//被拖动的部分

    void Start()
    {
        rect = GetComponent<ScrollRect>();
        var _rectWidth = GetComponent<RectTransform>();
        int t = content.transform.childCount / 6;//获取需要的移动部分的子物体个数,每一页放6个level
    
        var tempWidth = (t * _rectWidth.rect.width);//子对象长度   
        Debug.Log("t   " + _rectWidth.rect.width);

       content.sizeDelta = new Vector2(tempWidth, content.rect.height);

        //未显示的长度
        //Debug.Log(content.rect.width);

        float horizontalLength = tempWidth-_rectWidth.rect.width; //content.rect.width - _rectWidth.rect.width;

        for (int i = 0; i <t; i++)
        {
            pageArray.Add(_rectWidth.rect.width * i / horizontalLength);

            Debug.Log("posList[" + i + "]=" + pageArray[i]);

        }
    }

    void Update()
    {
        if (isDrag==false)
        {
  rect.horizontalNormalizedPosition = Mathf.Lerp(rect.horizontalNormalizedPosition,
            targethorizontal, Time.deltaTime*smoothing);
        }
      
        
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        isDrag = false;
        float posX = rect.horizontalNormalizedPosition;
        int index = 0;
        float offest = Mathf.Abs(pageArray[index] - posX);
        for(int i = 1; i < pageArray.Count; i++)
        {
            float offestItemp = Mathf.Abs(pageArray[i] - posX);
            if (offestItemp < offest)
            {
                index = i;
                offest = offestItemp;
            }
        }
        targethorizontal = pageArray[index];
       // rect.horizontalNormalizedPosition = pageArray[index];
    }
}
 


这样就做好了 关卡翻页的效果。

2018-07-20 15:12:41 qq302756113 阅读数 2921
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

一,新建ScrollView ,目录结构如图:

二,在content下编辑需要显示的关卡内容,这里设置为一页显示一个button集合,14个button为一整页,一次只显示一页内容:

下面上代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System;

public class MyScrollRectHelper : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{

    private float smooting;                          //滑动速度
    private float normalSpeed = 5;
    private float highSpeed = 100;
    private int pageCount = 1;                           //每页显示的项目
    public GameObject listItem;
    private ScrollRect sRect;
    private float pageIndex;                            //总页数
    private bool isDrag = false;                                //是否拖拽结束
    private List<float> listPageValue = new List<float> { 0 };  //总页数索引比列 0-1


    private float m_targetPos = 0;                                //滑动的目标位置

    private float nowindex = 0;                                 //当前位置索引
    private float beginDragPos;
    private float endDragPos;

    private float sensitivity = 0.15f;                          //灵敏度

    public Button nextPage;
    public Button prePage;
    private int onePageCount = 10;

    void Awake()
    {
        sRect = this.GetComponent<ScrollRect>();
        ListPageValueInit();
        smooting = normalSpeed;
        ButtonInit();
    }

    //每页比例
    void ListPageValueInit()
    {
        pageIndex = (listItem.transform.childCount / pageCount) - 1;
        if (listItem != null && listItem.transform.childCount != 0)
        {
            for (float i = 1; i <= pageIndex; i++)
            {
                listPageValue.Add((i / pageIndex));
            }
        }
    }

    void ButtonInit()
    {
        nextPage.onClick.AddListener(BtnRightGo);
        prePage.onClick.AddListener(BtnLeftGo);
    }

    void Update()
    {
        if (!isDrag)
            sRect.horizontalNormalizedPosition = Mathf.Lerp(sRect.horizontalNormalizedPosition, m_targetPos, Time.deltaTime * smooting);
    }

    /// <summary>
    /// 拖动开始
    /// </summary>
    /// <param name="eventData"></param>
    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
        beginDragPos = sRect.horizontalNormalizedPosition;
    }

    /// <summary>
    /// 拖拽结束
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        isDrag = false;
        endDragPos = sRect.horizontalNormalizedPosition; //获取拖动的值
        endDragPos = endDragPos > beginDragPos ? endDragPos + sensitivity : endDragPos - sensitivity;
        int index = 0;
        float offset = Mathf.Abs(listPageValue[index] - endDragPos);    //拖动的绝对值
        for (int i = 1; i < listPageValue.Count; i++)
        {
            float temp = Mathf.Abs(endDragPos - listPageValue[i]);
            if (temp < offset)
            {
                index = i;
                offset = temp;
            }
        }
        m_targetPos = listPageValue[index];
        nowindex = index;
    }

    public void BtnLeftGo()
    {
        nowindex = Mathf.Clamp(nowindex - 1, 0, pageIndex);
        m_targetPos = listPageValue[Convert.ToInt32(nowindex)];
    }

    public void BtnRightGo()
    {
        nowindex = Mathf.Clamp(nowindex + 1, 0, pageIndex);
        m_targetPos = listPageValue[Convert.ToInt32(nowindex)];
    }
}

 

Demo链接。

2014-03-23 11:46:21 u014227847 阅读数 581
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

改变场景视图角度的快捷键:
按鼠标中键平移视图;
按鼠标左键+Alt键旋转视图;
按鼠标右键+Alt键或滑动鼠标滑轮推拉视图;
按F键可以快速锁定选中的目标。

Unity只允许在空的文件夹内创建新工程。

问题:脚本名词有空格的话,在菜单的【Component】->【Scripts】里面找不到脚本。

只有将关卡添加到Scenes In Build里面才能被集成到最后编译的游戏中。

Debug.Log(“ 打印内容”);
Debug.LogError(“ 打印的内容显示红色”);

设置断点:MonoDevelop -> Run -> Attach to Process -> Unity Editor
F5越过当前断点。

【Open Editor Log】看资源分配情况。

我的开发环境是Windows 7下的Unity 4.3.4f1 + Visual Studio 2012。

发现【Extenrnal Tools】指定VS 2012无效,解决方法点这里

简单来说就是:
1、在VS 2012的这个目录Common7\IDE下面新建一个.bat文件;
2、在这个.bat文件里面写入start "" %*
3、在【Extenrnal Tools】指定这个.bat的路径。




策划需要对游戏中的数值进行计算和评估,它是保证游戏平衡性的关键。

关卡编辑工作主要都是在Unity的编辑器中完成的。

Unity程序员的主要工作就是编写脚本。

在Unity中,每个游戏中的物体都可以称为是一个游戏体(Game Object)。

Unity中的游戏可以拥有多个组件(Component)。组件可以是一个脚本,一个模型,一个物理碰撞体,一张贴图,一个粒子发射器,或是一个声音播放器。有了这些组件,游戏体就有了相应的功能,程序员可以通过编写脚本控制游戏体及它所拥有的组件,从而实现游戏的逻辑。

Unity不但能开发单人游戏,也能开发多人游戏。它内置了RakNet(一个网络游戏开发包),适用于快速开发多人游戏。

Unity支持几乎所有高端的3D动画软件(如3ds Max、Maya等),将制作的模型和动画导出为FBX格式供Unity使用。

Unity中,几乎所有的关联操作都可以通过拖动的方式完成。

?【P18】Shader设置
【Transparent】->【Cutout】->【Diffuse】,材质将带有Alpha信息;
【Transparent】->【Diffuse】,可以获得半透明效果,但在某些情况会出现Alpha乱序的情况;

?【P18】【Windows】->【Animation】->【Create New Clip】
Material、Main Text.offset.v

选择Main Camera,【GameObject】->【Align With View】是摄像机视角与当前视图一致。

脚本是实现游戏逻辑的核心,它本身并不能独立运行,它必须作为某个游戏体的组件才能运行。

只有继承自MonoBehaviour的类才能作为Unity脚本组件使用。

自定义脚本在菜单栏中的位置:
[AddComponentMenu("MyGame/Player")]

Update函数每一帧都会被调用。

Input是一个包装了输入功能的类,它包括几乎所有的键盘、鼠标或触控操作函数。

Time.deltaTime表示每帧的经过时间。


this.transform调用的是游戏体的Transform组件。

Vector3的三个参数表示在x、y、z三个方向上的移动距离。

Start函数会在对象被实例化时自动调用一次。

MonoBehaviour的派生类不能使用构造函数初始化。

只有public类型的属性才能在编辑器窗口实例化。

Destroy函数将游戏体销毁。

对于需要重复使用的游戏体,我们需要将其制作成Prefab。

Unity的游戏体只能使用Instantiate实例化,必能使用new。

?【P29】this.transform.Rotate用来旋转游戏体。Rotate的用法??

碰撞体【Box Collider】Is Trigger使其具有触发作用。

刚体【Rigidbody】Use Gravity重力影响;Is Kinematic使游戏体的运动不受物理模拟影响。

所有需要参与物理计算的游戏体都需要有一个刚体组件才能正常工作。

指定Tag标识,【Edit】->【Project Settings】->【Tags】
用途:xx.tag.CompareTo("xxx")。

OnTriggerEnter()在碰撞体互相接触时会被触发。

virtual虚方法,可以在派生类中重写这个方法。
override表示这是一个重写的方法。

Awake继承自MonoBehaviour,它会在游戏体实例化时执行一次,并先于Start方法。

FindGameObjectWithTag获得游戏体实例。

Quaternion.LookRotation在初始化时朝向主角方向。

.uniytpackage文件时Unity专用的资源包。

Audio Source凡是需要发声的游戏体,必须有这个组件。

AudioSource.PlayOneShot(AudioClip) 播放声音。

Random.value生成一个0.0到1.0之间的随机数。

在场景中可以看到,但是在游戏中不能看到的,放在一个Gizmos文件夹里面。


OnGUI是一个特殊的函数,专门用来画UI界面。

Application.Quit用来退出当前程序。

Application.LoadLevel用来读取下一个关卡。

默认在场景摄像机上有一个Audio Listener组件,3D声音的音量取决于声音源与摄像机的距离。

Static Batching会将静态模型整合,但有时会使游戏尺寸变大,如果不清楚优化原理,建议慎重使用这个功能。

?【51】Rendering Path中可以设置3种渲染模式:

Deferred Lighting\Forward Rendering\Vertex Lit


NGUI 例子8 scroll view

阅读数 1217

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