2015-09-22 17:52:38 u012842807 阅读数 2938
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4637 人正在学习 去看看 张刚
using System.Collections;
using UnityEngine;
public class MoveMouse : MonoBehaviour
{
    //下面的函数是当鼠标触碰到碰撞体或者刚体时调用,我的碰撞体设置是mesh collider,然后别忘了,给这个collider添加物理材质
    //值得注意的是世界坐标系转化为屏幕坐标系,Z轴是不变的
    IEnumerator OnMouseDown()
    {
        //将物体由世界坐标系转化为屏幕坐标系 ,由vector3 结构体变量ScreenSpace存储,以用来明确屏幕坐标系Z轴的位置
        Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(transform.position);
        //完成了两个步骤,1由于鼠标的坐标系是2维的,需要转化成3维的世界坐标系,2只有三维的情况下才能来计算鼠标位置与物体的距离,offset即是距离
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));
        Debug.Log("down");
        //当鼠标左键按下时
        while (Input.GetMouseButton(0))
        {
            //得到现在鼠标的2维坐标系位置
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z);
            //将当前鼠标的2维位置转化成三维的位置,再加上鼠标的移动量
            Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            //CurPosition就是物体应该的移动向量赋给transform的position属性
            transform.position = CurPosition;
            //这个很主要
            yield return new WaitForFixedUpdate();
        }
    }
}
2017-11-25 10:57:08 q764424567 阅读数 1100
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4637 人正在学习 去看看 张刚





unity 鼠标手势的左右滑动

using UnityEngine;  
using System.Collections;  

public class HeroModelRotate : MonoBehaviour  
{  
    /// <summary>  
    /// 第一次按下的位置  
    /// </summary>  
    private Vector2 first = Vector2.zero;  
    /// <summary>  
    /// 鼠标的拖拽位置(第二次的位置)  
    /// </summary>  
    private Vector2 second = Vector2.zero;  
    /// <summary>  
    /// 旋转的角度  
    /// </summary>  
    private float angle = 3f;  

    void OnGUI()  
    {  
        if (Event.current.type == EventType.MouseDown)  
        {  
            //记录鼠标按下的位置     
            first = Event.current.mousePosition;  
        }  
        if (Event.current.type == EventType.MouseDrag)  
        {  
            //记录鼠标拖动的位置     
            second = Event.current.mousePosition;  

            if (second.x < first.x)  
            {  
                //拖动的位置的x坐标比按下的位置的x坐标小时,响应向左事件     
                this.transform.Rotate(Vector3.up, angle);  
            }  
            if (second.x > first.x)  
            {  
                //拖动的位置的x坐标比按下的位置的x坐标大时,响应向右事件     
                this.transform.Rotate(Vector3.down, angle);  
            }  
            first = second;  
        }  
    }  
}  

2015-06-06 18:42:50 linxinfa 阅读数 1042
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4637 人正在学习 去看看 张刚
private Vector3 m_uiWroldPos;
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            m_uiWroldPos=UICamera.mainCamera.ScreenToWorldPoint(
                new Vector3(Input.mousePosition.x,Input.mousePosition.y,0));
            if (m_spr != null && m_parentPanel != null)
            {
                m_spr.transform.localPosition = m_parentPanel.transform.InverseTransformPoint(m_uiWroldPos);
            }
        }
    }



其中m_spr是在m_parentPanel上建的一个UISprite


关键知识点:

屏幕坐标转世界坐标

根据世界坐标转换为以某个物体为父亲的局部坐标



2016-08-23 14:49:58 yu__jiaoshou 阅读数 1152
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4637 人正在学习 去看看 张刚

Unity 3D - 可视化变量标注 :

常用 :

  • 拖动条 :
    [Range(0, 100)]

  • 大标题 :
    [HeaderAttribute(“属性”)]

  • 停留提示 :
    [TooltipAttribute (“生命值”)]

  • 隐藏 :
    [HideInInspector]


public 和 private 正常情况:

  • public 的变量值会显示在 Inspector 视图中 .
public float HP;

这里写图片描述

  • private 不会显示在 Inspector 面板上 .
private float HP;

这里写图片描述


私有变量 ( private ) 显示在 Inspector 面板上 :

如何想要私有变量 (private )也显示在Inspector 面板上 , 那么就需要使用序列化 (SerializeField) .

[SerializeField]  private float HP;

这里写图片描述

使用 [SerializeField] 可以让 private 变量显示在 Inspector 面板上 , 并且不会改变变量本质( 变量任是私有的 ) .


Range 显示 :

[Range(0,100)]  private float HP;

加上一个Range 参数 , 显示方式会变成拖动条形式 .

这里写图片描述


HeaderAttribute 显示 :

 [Range(0, 100), HeaderAttribute("血量")] private float HP;

加上HeaderAttribute (“血量”) 后 , 在 Inspector 上显示如下图 .

这里写图片描述


TooltipAttribute 显示 :

[SerializeField, Range(0, 100), HeaderAttribute("血量"), TooltipAttribute("生命值")]
private float HP;

[SerializeField, Range(0, 100), HeaderAttribute("蓝量"), TooltipAttribute("魔法值")]
private float MP;

加上TooltipAttribute (“生命值”) , 鼠标放在对应变量上 , 显示如图提示 .

这里写图片描述

2017-12-21 17:23:51 yuyingwin 阅读数 519
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4637 人正在学习 去看看 张刚
using UnityEngine;
using UnityEngine.UI;
using System.Collections;


public class PictureZoom : MonoBehaviour
{
    #region Zoom


    /// <summary>
    /// 上一帧两指间距离
    /// </summary>
    private float lastDistance = 0;


    /// <summary>
    /// 当前两个手指之间的距离
    /// </summary>
    private float twoTouchDistance = 0;


    /// <summary>
    /// 得到图片
    /// </summary>
    public RectTransform image;


    /// <summary>
    /// 第一根手指按下的坐标
    /// </summary>
    Vector2 firstTouch = Vector3.zero;


    /// <summary>
    /// 第二根手指按下的坐标
    /// </summary>
    Vector2 secondTouch = Vector3.zero;


    /// <summary>
    /// 是否有两只手指按下
    /// </summary>
    private bool isTwoTouch = false;


    #endregion


    #region Move


    // 鼠标起点
    private Vector2 originalLocalPointerPosition;
    // 面板起点  
    private Vector3 originalPanelLocalPosition;
    // 当前面板  
    private RectTransform panelRectTransform;
    // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小
    private RectTransform parentRectTransform;
    private static int siblingIndex = 0;


    #endregion


    [SerializeField]
    Camera pressEventCamera;
    [SerializeField]
    Image images;
    void Awake()
    {
        panelRectTransform = transform.parent as RectTransform;
        parentRectTransform = panelRectTransform.parent as RectTransform;
    }


    // Use this for initialization
    void Start()
    {
    }


    // Update is called once per frame
    void Update()
    {
        //如果有两个及以上的手指按下
        if (Input.touchCount > 1)
        {
            //当第二根手指按下的时候
            if (Input.GetTouch(1).phase == TouchPhase.Began)
            {
                isTwoTouch = true;
                //获取第一根手指的位置
                firstTouch = Input.touches[0].position;
                //获取第二根手指的位置
                secondTouch = Input.touches[1].position;


                lastDistance = Vector2.Distance(firstTouch, secondTouch);
            }


            //如果有两根手指按下
            if (isTwoTouch)
            {
                //每一帧都得到两个手指的坐标以及距离
                firstTouch = Input.touches[0].position;
                secondTouch = Input.touches[1].position;


                twoTouchDistance = Vector2.Distance(firstTouch, secondTouch);


                //当前图片的缩放
                Vector3 curImageScale = new Vector3(image.localScale.x, image.localScale.y, 1);
                //两根手指上一帧和这帧之间的距离差
                //因为100个像素代表单位1,把距离差除以100看缩放几倍
                float changeScaleDistance = (twoTouchDistance - lastDistance) / 100;
                //因为缩放 Scale 是一个Vector3,所以这个代表缩放的Vector3的值就是缩放的倍数
                Vector3 changeScale = new Vector3(changeScaleDistance, changeScaleDistance, 0);
                //图片的缩放等于当前的缩放加上 修改的缩放
                image.localScale = curImageScale + changeScale;
                //控制缩放级别
                image.localScale = new Vector3(Mathf.Clamp(image.localScale.x, 0.5f, 10f), Mathf.Clamp(image.localScale.y, 0.5f, 10f), 1);
                //这一帧结束后,当前的距离就会变成上一帧的距离了
                lastDistance = twoTouchDistance;
            }


            //当第二根手指结束时(抬起)
            if (Input.GetTouch(1).phase == TouchPhase.Ended)
            {
                isTwoTouch = false;
                firstTouch = Vector3.zero;
                secondTouch = Vector3.zero;
            }
        }
        else if (Input.touchCount == 1)
        {
            Vector2 pos = Input.GetTouch(0).position;


            if (Input.GetTouch(0).phase == TouchPhase.Began)
            {
                if (images)
                {
                    images.color = Color.green;
                }
                OnPointerDown(pos, pressEventCamera);
            }
            else if (Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                if (images)
                {
                    images.color = Color.yellow;
                }
                OnDrag(pos, pressEventCamera);
            }
        }
    }








    public void OnPointerDown(Vector2 position, Camera pressEventCamera)
    {
        siblingIndex++;
        panelRectTransform.transform.SetSiblingIndex(siblingIndex);


        originalPanelLocalPosition = panelRectTransform.localPosition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, position, pressEventCamera, out originalLocalPointerPosition);
    }


    public void OnDrag(Vector2 position, Camera pressEventCamera)
    {
        if (panelRectTransform == null || parentRectTransform == null)
            return;


        Vector2 localPointerPosition;


        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, position, pressEventCamera, out localPointerPosition))
        {
            Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
            panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
        }


        ClampToWindow();
    }


    // Clamp panel to area of parent
    void ClampToWindow()
    {
        Vector3 pos = panelRectTransform.localPosition;


        Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;
        Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;


        pos.x = Mathf.Clamp(panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);
        pos.y = Mathf.Clamp(panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);


        panelRectTransform.localPosition = pos;
    }


}



Unity3D 窗口裁剪

阅读数 2907

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