Unity开发中的碰到的一些问题总结及解决办法(持续更新:最近2019-8-3更新)

  1. Gameobject.GetComponent<>().调用在Start()函数之前,如果设置不同值只有Start中的会被设定。
  2. 如果想在update函数中只调用一次方法,应该加一个控制变量;
  3. NGUI中UILabel字体固定大小要设置Overflow为Resize Freely
  4. NGUI设置自适应用anchors-> type:unified;Standalone和freeAspect切换时界面不乱要使UI Root->Scaling Style->Constrained
  5. NGUI取到当前控件的值:如UIPopupList.current.value.Trim(); 去除两端空格          UIToggle.current.value;
  6. NGUI拖拽:Drag Object;调节大小功能:Drag Resize;
  7. 随机数Random.Range(0,4); 不包含最大值,取值为0,1,2,3
  8. 预设拖上去的按下apply可以更改原预设
  9. 添加到一个物品下:this.transform.parent = obj.transform;
  10. 世界坐标:transform.position;局部坐标(子物体相对于父物体):transform.localposition;
  11. ScrollView的设置:

Unity开发中的碰到的一些问题总结及解决办法(持续更新:最近2019-8-3更新)_第1张图片Unity开发中的碰到的一些问题总结及解决办法(持续更新:最近2019-8-3更新)_第2张图片

Unity开发中的碰到的一些问题总结及解决办法(持续更新:最近2019-8-3更新)_第3张图片Unity开发中的碰到的一些问题总结及解决办法(持续更新:最近2019-8-3更新)_第4张图片Unity开发中的碰到的一些问题总结及解决办法(持续更新:最近2019-8-3更新)_第5张图片

12. 动态加载资源:

obj = Instantiate(Resources.Load("AssembleTestPrefabs/235A-3")) as GameObject;

文件目录结构为:Resources/AssembleTestPrefabs/235A-3

13. ulua->tolua;xlua:tencent

14. UNITY加载场景:using UnityEditor.SceneManagement; EditorSceneManager.LoadScene("SceneName");//重新打开ScnenName 场景上面的仅仅在编译时可以用,但是打包时就会出现错误,因为你使用了Editor文件

下面的可以不使用Editorusing UnityEngine.SceneManagement;

SceneManager.LoadScene (0);或者(scenename’)

15. Ctrl+D的时候不要忘记将克隆源上绑定的代码和设置。

16. List items中如果要更改其中的值,要通过新建一个struct,更改其中的值再通过items下标赋值,直接通过items下标更改不行,方法如下:

MySubject ms = new MySubject();
ms= CurrentSubjects[CurrentNumIndex];
ms.SetCurrentSubAnser(0);
CurrentSubjects[CurrentNumIndex] = ms;

17. RenderTexture的应用:首先新建一个RenderTexture,拖至Camera的TargetTexture处,然后将此RenderTexture拖至NGUI –>Texture的Texture处或者新建一个材质,将材质shader修改出有texture属性的,在texture属性处选中这个RenderTexture,然后将此材质赋值给NGUI –>Texture;(关于大小的问题,是否可以不用Texture控件而改成Sprite,还没有进行试验)。

使用render texture时摄像机可以调成depth only或者Solid Color(去掉边框)

18.NGUI按钮持续按下代码方法:将下面代码挂载在需要的按钮上

void OnPress(bool isPressed)
{
    bool fire = isPressed;
    if(fire)//按下中
    {               
        MyAudioManager.BuzzerPlay();//蜂鸣器声音播放
    }else//按钮抬起
    {
        MyAudioManager.BuzzerStop();//蜂鸣器声音停止
    }
}

19.延时运行:

    1.Invoke(函数名称字符串,几秒种后执行); 这种调用方法只会执行一次。

    2.InvokeRepeating(函数名称字符串,几秒钟后开始,间隔秒数);这种调用方法就像一个计

可以得到的属性:

    1. IsInvoking() 只要有Invoke在运行,就返回true.

    2. IsInvoking(函数名字符串) 当这个函数正在Invoke的时候返回true

    3. CancelInvoke([函数名字符串]) 取消所有Invoke或者对应Invoke

20.做界面的时候一定要先调好自适应,不然之后屏幕比例改变再更改会很麻烦。

21.unity asset store 插件下载目录:C:\Users\Administrator\AppData\Roaming\Unity\Asset Store-5.x

22.animation动画制作的时候如果想让动画不受模型影响,就在需要刻动画的物体上面添加一个空物体。

23.animation动画添加事件的时候要在和animator同级的物体上绑定代码。

24.不同语句如果排列顺序不同,效果可能也会不同。比如自己编写的摄像头移动类,lookat要放在鼠标更改位置之后才能防止摄像头抖动。

25.使animator控制的动画在某个点开始播放的函数:MyAnimator.ForceStateNormalizedTime(0.5f);//取值为0~1

26.取得animator控制的动画在某个点的值(进度):MyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime;//取值为0~1 注意其中在不播放时这个值会大于1持续增长。

27.Unity中游戏暂停和开始怎么实现?

最简单的是设置Time.timeScale = 0,即可让游戏暂停,也可以使用Time.timeScale来做游戏的 1倍2倍整体加速,但要记住无论Time.timeScale等于多少Update和LateUpdate都会去执行,所以这两个方法里面需要自己用代码控制。而且如果游戏暂停以后想在暂停界面上继续播放一些不受Time.timeScale影响的动画或者粒子特效之类的,那么我们就需要用到Time.realtimeSinceStartup去单独恢复他们,还有声音部分也需要单独恢复timeScale。
最大的影响是,在timeScale=0时无法实现暂停菜单的动画以及各种漂亮的点击效果。
如果只想暂停某部分,或者为了更多需求和可扩展性,还是需要自己写个相关的Manager来手动管理游戏的暂停和开始。

28.设置animator动画为不受timescale影响:获取自身的Animator组件,把它的updateMode设置为Animator.updateMode = AnimatorUpdateMode.UnscaledTime;

Animator就不受timeScale的影响了,要恢复就设成原来的

= AnimatorUpdateMode.Normal;

29.Time类:

只读:

Time.time:表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。

Time.deltaTime:表示从上一帧到当前帧的时间,以秒为单位。

Time.unscaledDeltaTime:不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。

Time.timeSinceLevelLoad:表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。

Time.unscaledTime:不考虑timescale时候与time相同,若timescale被设置,则无效。

Time.fixedDeltaTime:表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。

Time.realtimeSinceStartup: 表示自游戏开始后的总时间,即使暂停也会不断的增加。

Time.frameCount:总帧数

可读可写:

Time.fixedTime:表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。

Time.SmoothDeltaTime:表示一个平稳的deltaTime,根据前 N帧的时间加权平均的值。

Time.timeScale:时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,非常有用。

Time.captureFramerate:表示设置每秒的帧率,然后不考虑真实时间。

30.获取当前Animator播放动画的名字:

AnimatorStateInfo Info = Animator.GetCurrentAnimatorStateInfo(0);
if (Info.IsName("New State"))

31. UGUI Scroll 添加上Scroll Rect和Mask:引用两个接口,按页滑动 差值 使界面在最近位置停下 代码如下

public class NewBehaviourScript : MonoBehaviour,IBeginDragHandler,IEndDragHandler
{
    private ScrollRect scrollRect;
    private float[] pageArray = new float[]{0,0.333f,0.666f,1};
    private float targetHorizontalPositon = 0;
    private bool isDraging = false;
    public float smoothing = 4;
    // Use this for initialization
    void Start ()
    {
        scrollRect = GetComponent();
    }

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

    public void OnEndDrag(PointerEventData eventData)
    {
        isDraging = false;
        float posX = scrollRect.horizontalNormalizedPosition;
        int index = 0;
        float offset = Mathf.Abs(pageArray[index] - posX);
        for (int i = 1; i < pageArray.Length; i++)
        {
            float offsetTemp = Mathf.Abs(pageArray[i] - posX);
            if (offsetTemp < offset)
            {
                index = i;
                offset = offsetTemp;
            }
        }
        targetHorizontalPositon = pageArray[index];
        toggleArray[index].isOn = true;
        //scrollRect.horizontalNormalizedPosition = pageArray[index];
    }
}

32.C#扩展方法 百度。注意类名和方法名都要设置成static,在其他地方的时候要using这个类的命名空间,注意:方法名参数第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀。

33.世界坐标系转屏幕坐标系:

UGUI:

Vector2 player2DPosition = Camera.main.WorldToScreenPoint(targetTransform.position);//方法
rectTransform.position = player2DPosition + new Vector2(xOffset, yOffset);
Vector2 pos = RectTransformUtility.WorldToScreenPoint(Camera.main,targetTransform.position);//方法二
rectTransform.position = pos + new Vector2(xOffset, yOffset);

NGUI:

guiCamera = NGUITools.FindCameraForLayer(this.gameObject.layer);   //通过脚本所在物体的层获得相应层上的相机
Vector3 pos = worldcamera.WorldToScreenPoint(TargetObject.transform.position);//获取目标物体的屏幕坐标
pos = guiCamera.ScreenToWorldPoint(pos);             //将屏幕坐标转换为UI的世界坐标
pos.z = 0;  //由于NGUI 2D界面的Z轴都为0,这里我们将坐标修改为0.只取其X,Y坐标。
transform.position = new Vector3(pos.x -0.2f, pos.y + .30f, pos.z);//将修改过的坐标赋给UI界面。这里指Panel_CharacterInfo

34.lambda+DoTween修改一个variable的值:

    

DOTween.To(() => myValue, x => myValue = x, new Vector3(10, 10, 10), 2);

35.关于DoTween的一些操作:http://dotween.demigiant.com/    

Tweener tweener = panelTransform.DOLocalMove(new Vector3(0, 0, 0), 0.3f);

tweener.SetAutoKill(false);//修改不会自动删除这个tween

tweener.Pause();//暂停动画

tweener.SetEase(Ease.Linear);//设置播放方式

tweener.SetLoops(2);//设置循环播放几次

tweener.OnComplete(OnTweenComplete);//设置播放完之后执行的函数 

panelTransform.DOPlayForward();向前播放

panelTransform.DOPlayBackwards();向后播放 回放

text.DOText("text", 1);//一个个出字

this.transform.DOShakePosition(1,new Vector3(3,3,0));//抖动

Material.DOColor(Color.red,“_TinyColor”,2);

text.DOColor(Color.red, 2);//更改颜色

text.DOFade(1, 3);//更改透明度 0~1

DoTweenAnimation脚本,可视化。

DoTweenPath:路径。DoTweenPath.DOTogglePause;暂停与播放

transform.DOBlendableLocalMoveBy(Vector3.one, 2);

material.DOGradientColor(_gradient, "_TintColor", 2);//颜色渐变

material.DOOffset();

material.DOVector(Color.clear,"_TintColor",2);

material.DOBlendableColor(Color.red,"_Color", 2);//颜色混合 

material.DOBlendableColor(Color.yellow, "_Color",2);//颜色混合

36.DOTween相机的一些方法:    

camera.DOAspect(0.5f, 1);//改变宽高比

camera.DOColor(Color.red, 2);//改变背景颜色

camera.DONearClipPlane();//近切面

camera.DOFarClipPlane();//远切面

camera.DOFieldOfView(1, 2);//第一个值越小所看到的物体越大

camera.DOOrthoSize();//正焦模式下的size值

camera.DOPixelRect(new Rect(0,0,500,500), 2);//渐变相机的像素区域

camera.DORect();//Viewport Rect 多相机分屏

37.DoTween队列:

    Sequence quence = DOTween.Sequence();
    quence.Append(transform.DOMove(Vector3.one, 2));//向队列里面添加动画
    quence.AppendInterval(1);//间隔一秒
    quence.Append(transform.DOMove(new Vector3(1,0,0), 2));//向队列里面添加动画
    quence.Insert(0, transform.DOMove(-Vector3.one, 2));//在第0秒插入一段动画  会覆盖之前0秒的动画。如果和插入点动画效果不同则两个都生效,否则覆盖。
    quence.Join(transform.DOMove(-Vector3.one, 2));//添加到上一个动画中,一起执行
    quence.PrependInterval(1);
    quence.Prepend(quence.Join(transform.DOMove(-Vector3.one, 2)));//预添加 后添加的先执行 一般添加到(所有)Append之前 开口向上 append开口向下
    quence.InsertCallback(5,CallBackFunName);//在第5秒的时候调用一个函数
    quence.PrependCallback(CallBackFunName);//在预添加的时候调用函数
//DoTween设置参数:
    TweenParams param = new TweenParams();
    param.SetLoops(3, LoopType.Yoyo);
    transform.DOMove(Vector3.one*3, 1).SetAs(param).SetEase(Ease.Linear);//链式编程
    transform.DOMove(Vector3.one * 3, 1).From(true);//From是从结束到开始 加上true变成相对运动
    transform.DOMove(Vector3.one * 3, 1).SetDelay(3);//延时3秒再动
    transform.DOMove(Vector3.one * 3, 2).SetSpeedBased();//(里面加或不加true)以速度为基准 每秒运行2个unity单位 加false和不写这条一样
    transform.DOMove(Vector3.one * 3, 2).SetId("ID");
    DOTween.Play("ID");//调用上面缓存的动画
    transform.DOMove(Vector3.one * 3, 2).SetRecyclable(true);//动画可回收
    transform.DOMove(Vector3.one * 3, 1).SetRelative(true);//增量运动 相对运动
    transform.DOMove(Vector3.one * 3, 1).SetUpdate(UpdateType.Normal,true);//true 不受timescale影响
    transform.DOMove(Vector3.one * 3, 1).SetEase(Ease.Linear);//设置为线性 flash有3个重载参数 曲线运动查询网:http://robertpenner.com/easing/easing_demo.html
    public AnimationCurve _curve;
    transform.DOMove(Vector3.one * 3, 1).SetEase(_curve);//自定义曲线                                  
    transform.DOMove(Vector3.one, 1).SetEase(EaseFun);//自定义函数 如下
    private float EaseFun(float time, float duration, float overshootOrAmplitude, float period){
        return time / duration;//返回值控制在0~1之间才成到达正确地址
    }
    transform.DORewind();
    transform.DOSmoothRewind();
    transform.DOFlip();//反转补间
    transform.DOGoto(3,true);//跳转到第3秒 然后播放
    transform.DOPlayBackwards();//反向播放动画
    transform.DOPlayForward();//正向播放动画
    transform.DOTogglePause();//运行的时候播放暂停,暂停的时候播放

    var list = DOTween.PausedTweens();//获得暂停的所有动画
    var list2 = DOTween.PlayingTweens();//获得播放的所有动画
    var list3 = DOTween.TweensById("ID",true);//获得ID的动画 true代表当前播放的动画
    var list4 = DOTween.TweensByTarget(transform,true);//获得transform上的动画,true代表播放时的动画
    var list5 = DOTween.IsTweening("ID",true);//是否有这个动画正在执行 如果加true 播放暂停时都检测是否有
    var list6 = DOTween.TotalPlayingTweens();//当前所有播放的动画数组

    var tweener =  transform.DOMove(Vector3.one * 2, 2);
    await Task.Delay(TimeSpan.FromSeconds(1));
    Debug.Log(tweener.fullPosition);
    await Task.Delay(TimeSpan.FromSeconds(0.5f));
    tweener.fullPosition = 0;//从0秒开始播放动画

    Debug.Log(tweener.CompletedLoops());//完成的循环次数
    tweener.Delay();//延时
    tweener.Duration(false);//持续时间 false 为一次时间 true为循环总和时间
    tweener.Elapsed(false);//当前已经播放的时间 false 不包含循环 true包含
    tweener.ElapsedDirectionalPercentage();//播放进度的百分比

38.出现这种原来是好的 突然不行了的情况如下面NGUI的label坏了的情况,建议删除library文件夹然后重新打开项目

unlit/transparent colored shader doesn't have a clipped shader version for 1 clip regions

39.BUTTON长按事件:

NGUI:

void OnPress(bool isPressed){}//绑定到需要长按的BUTTON上。

UGUI:

一:创建一个脚本,继承自Button,在UpDate中判断 IsPressed().来执行。

二:通过下面代码创建一个脚本,然后将绑定到button上(其他UI也可以,如果不显示就重新编译下重新挂上),就可以拖拽实现需要运行的代码(长按):

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

public class RepeatPressEventTrigger : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler
{
    public float _interval = 0.1f;
    [SerializeField]
    public UnityEvent m_OnLongpress = new UnityEvent();
    private bool isPointDown = false;
    private float lastInvokeTime;
    private int i;
	// Use this for initialization
	void Start ()
	{
	    i = 0;
	}
    public void PressDebug()
    {
        i++;
        Debug.Log(i.ToString());
    }
	// Update is called once per frame
	void Update () {
	    if (isPointDown)
	    {
	        if (Time.time - lastInvokeTime>_interval)
	        {
	            m_OnLongpress.Invoke();
	            lastInvokeTime = Time.time;
	        }
	    }
	}
    public void OnPointerDown(PointerEventData eventData)
    {
        m_OnLongpress.Invoke();
        isPointDown = true;
        lastInvokeTime = Time.time;
    }
    public void OnPointerUp(PointerEventData eventData)
    {
        isPointDown = false;
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        isPointDown = false;
    }
}

40.转换int:        Int32.Parse(idvalue.ToString());

41.Alt + Insert,然后选择formatting members可以重写tostring方法。需要resharper?

42.Mesh合并:

/// 
/// Mesh合并
/// 
void MeshCombine()
{
    MeshFilter[] filters = GetComponentsInChildren();
    CombineInstance[] combiners = new CombineInstance[filters.Length];
    for (int i = 0; i < filters.Length; i++)
    {
        combiners[i].mesh = filters[i].sharedMesh;
        combiners[i].transform = filters[i].transform.localToWorldMatrix;
    }
    Mesh finalMesh = new Mesh();
    finalMesh.CombineMeshes(combiners);
    //下面合并 注意添加meshfilter & mesh renderer;
    GetComponent().sharedMesh = finalMesh;
}

43.有的地方字段设置成属性可以控制访问权限,在set前加上private。属性可以做单例模式。

44.assetstore中插件下载位置:Windows系统下,Unity商店的默认插件保存在:“C:\Users(或者用户)\你的登录用户名\AppData\Roaming\Unity\Asset Store-5.x”中,Asset Store-5.x是Unity的版本。而Mac则是在“~/Library/Unity/Asset Store”下。请注意,在Windows中AppData目录是一个隐藏目录,你可以在地址栏中输入这个目录来进入这个隐藏文件夹。

C:\Users\Administrator\AppData\Roaming\Unity\Asset Store-5.x

45.合并模型:性能优化视频12课。好像可以减少drawcall

46.3D UGUI 中的字体按T后调大字体大小,然后然R缩放会解决字体失真的问题。

47.遮罩效果使用mask,需要显示的为mask 图片的子物体。

48.当声音出现问题无声的时候检查是不是有多余的Audio Listener,一般在摄像头上。

49. Debug.Log("当前播放时长(秒,可赋值,从赋值时间开始播放)" + ThisAudioSource.time);   

      Debug.Log("当前音乐总长度(秒)" + ThisAudioSource.clip.length);            

50.使射线不穿透UGUI:

if (Physics.Raycast(ray, out hitInfo, targetingRayLength, targetingLayerMask.value)&& !EventSystem.current.IsPointerOverGameObject())
{
	// Cache what we've hit
	targetTransform = hitInfo.collider.transform;
}

51.这是由于你当前登陆的 Unity 账户不在项目的成员列表中。

如果这个项目从头到尾都是你在做,而且之前打包是没问题的,那么很可能是你创建项目时的 Unity 账户跟当前登陆的 Unity账户不同(创建项目时未登录现在登陆了,或者创建项目时登陆了现在未登录,或者项目是别人创建的你拿过来用等等)

【解决方法】

打开服务选项卡(点击窗口-->服务,或者直接快捷键 ctrl + 0)。

点 new link -->  选择自己的Unity 账号 --> create

然后将自己的账号加进去就好了。

52.Asset-》run API update

53.为了保证数据执行顺序最好自己写个init方法调用而不直接写在start中。

54.ToString(“F1”);ToString(“0.00”);可以控制float类型小数点后几位。

55.按住V可以更好的摆放物体,使物体相挨着。

56.射线有时会被触发器Trigger拦截,导致达不到预期效果,只用取消Edit->project settings->physics中的Queries hit triggers对勾,即可设置Raycast投射出的射线不与触发器发生碰撞。

57.C:\Users\Administrator>d:

     d:\>cd 参考项目

     d:\参考项目>TREE>DLIST.TXT /F

58.DOTween和UGUI做UI位移的时候注意可以使用localPosition来定位,一般设置成自适应后屏幕大小是Canvas Scaler 中Reference Resolution的大小。(好像只适用于全屏大小的UI)。最佳的还是用下面代码实现:

先设置好anchor和pivot。通过pivot移动到anchor的位置。

((RectTransform)this.transform).anchoredPosition = new Vector3(0, -this.GetComponent().rect.height / 2, 0);
if (GUI.Button(new Rect(111,111,111,111),"move" ))
{
            if (Display)
            {
                Display = false;
                ((RectTransform)this.transform).DOAnchorPos(
                    new Vector2(0, -this.GetComponent().rect.height / 2), 0.5f);
            }
            else
            {
                Display = true;
                ((RectTransform)this.transform).DOAnchorPos(
                    new Vector2(0, this.GetComponent().rect.height / 2), 0.5f);
            }
}

59.UGUI Button 添加事件:

    buttonObj = GameObject.Find("Button");
    buttonObj.GetComponent

60.要有明确的目标。

61.关闭协程只能关闭当前类里面的协程,关闭其他类协程要通过类的实例调用。

62.类中public的东西最好不要用拖拽的方式,使用代码得到会保险一些。

63.单例类(类名不用加static)可以当全局的管理类。

64.鼠标控制放大缩小旋转物体:

        float horizontal = Input.GetAxis("Horizontal"); //获取横轴参数。(如:按A键返回-1 按D键返回+1,但中间有一个过度,而不是直接变-1或+1。)
        float vertical = Input.GetAxis("Vertical"); //获取垂直参数。
        //Debug.Log("horizontal: " + horizontal + ",vertical:" + vertical);
        float mouseX = Input.GetAxis("Mouse X");//获取鼠标X轴滑动参数
        float mouseY = Input.GetAxis("Mouse Y");//获取鼠标Y轴滑动参数
        //Debug.Log("mouseX: " + mouseX + ",mouseY:" + mouseY);
        float mouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
        //if (Vector3.Distance(this.transform.position, mInitPosition) <= 2.0f)
        {
        //键盘ADWS键控制物体移动。(当乘以Time.deltaTime实际表示:每秒移动物体N米,而不是每帧N米。)
            this.transform.Translate(new Vector3(-horizontal * Time.deltaTime * moveSpeed, 0, vertical * Time.deltaTime * moveSpeed));
        }
        
        if (Input.GetMouseButton(1))
        {   
            //鼠标XY轴滑动控制物体旋转
            this.transform.Rotate(new Vector3(Input.GetAxis("Mouse Y") * Time.deltaTime * 200, -Input.GetAxis("Mouse X") * Time.deltaTime * 200, 0), Space.World);
            //this.transform.Rotate(new Vector3(-mouseY * Time.deltaTime * rotateSpeed, 0, -mouseX * Time.deltaTime * rotateSpeed),Space.Self);
        }
        //鼠标中键控制物体缩放
        this.transform.localScale += new Vector3(mouseScrollWheel, mouseScrollWheel, mouseScrollWheel);
    

65.UGUI制作部件介绍UI的时候,设置这个现实UI的pivot为左上后就不用了计算偏移量了。

66.鼠标旋转物体:gameObject.transform.Rotate(new Vector3(Input.GetAxis("Mouse Y") * Time.deltaTime * 200, -Input.GetAxis("Mouse X") * Time.deltaTime * 200, 0),Space.World);

67.让未激活的物体及其子物体也打印出来呢?

​​​​​​​grandFa =  GetComponentsInChildren();//括号里面加个true就好了。

grandFa =  GetComponentsInChildren(true);

68.把PPT转变成图片:

///需要配合Aspose.Slides.dll Aspose.Slides.xml System.Drawing.dll这些文件
using Aspose.Slides;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

    public Sprite[] mSprites = new Sprite[10];

    public byte[] Bitmap2Byte(System.Drawing.Bitmap bitmap)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            bitmap.Save(stream, ImageFormat.Png);
            byte[] data = new byte[stream.Length];
            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(data, 0, Convert.ToInt32(stream.Length));
            return data;
        }
    }


    /// 
    /// 根据路径返回pptx图片数组
    /// 
    /// 
    /// 
    public Sprite[] ReturnSprites(string pptPath)//string pptPath = Application.dataPath + "/Plugins/Aspose.Slides.NET.18.10.0(Crack)/5-7输送站常见故障及处理方法.pptx";
    {
        var presentation = new Aspose.Slides.Presentation(pptPath);

        Sprite[] sprites = new Sprite[presentation.Slides.Count];
        float width = presentation.SlideSize.Size.Width;
        float height = presentation.SlideSize.Size.Height;

        //遍历文档
        for (int i = 0; i < presentation.Slides.Count; i++)
        {

            var slide = presentation.Slides[i];
            var bitmap = slide.GetThumbnail(1f, 1f);
            byte[] bytes = Bitmap2Byte(bitmap);

            Texture2D texture2D = new Texture2D((int)width, (int)height);
            texture2D.LoadImage(bytes);
            Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, width, height), Vector2.zero);
            sprites[i] = sprite;
        }

        return sprites;
    }

69.通过文件路径获取文件名等:

string fullPath = @"\WebSite1\Default.aspx";
string filename = System.IO.Path.GetFileName(fullPath);//文件名  “Default.aspx”
string extension = System.IO.Path.GetExtension(fullPath);//扩展名 “.aspx”
string fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(fullPath);// 没有扩展名的文件名 “Default”

70.unity引擎 灯光处一个存在的BUG(2018.2.14版本有存在):切换场景后有可能场景会变按,这时候点击Window->Rendering->Lighting settings:取消勾选下面的Auto Generate再勾上可解决。

​​​​​​​71.Unity中限制轴向移动范围Mathf.Clamp

Mathf.Clamp

  在游戏中,为了限制玩家的某一轴向的移动不超过一定的范围,可以用Mathf.Clamp来解决

Mathf.Clamp(float value,float min,float max)

在 Mathf.Clamp 中传入三个参数:value,min,max

限制 value的值在min,max之间,如果value大于max,则返回max,如果value小于min,则返回min,否者返回value;

例如:

_rig.transform.position = new Vector3(transform.position.x, transform.position.y,Mathf.Clamp(_rig.transform.position.z, -20.0f, 28.0f));

这里限制了刚体的Z轴方向的移动,刚体在-20.0到28.0范围内移动。

​​​​​​​72.多个物体调用共用1个物体里的东西时最好用单例(如多个使用一个list)。

    public static RunControl Instance;
    private void Awake()
    {
        Instance = this;
    }

73.Unity发布PC端时固定分辨率:

Screen.SetResolution(1366, 768, true);

前两个参数为想要得到的分辨率的宽和高,第三个参数选择是否全屏,true为全屏模式,false为窗口模式

你可能感兴趣的:(Tween,UI,Unity,C#)