text unity3d

2018-06-06 17:29:15 xiaochenXIHUA 阅读数 12567
  • Unity 值得看的500+ 技术内容列表

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

一、搭建场景

注意:UICamera需要包含整个场景
二、编写关于Text显示标签的脚本(Test_DriftingSpecialEffect)
/***
*	Title:"XXX" 项目
*		主题:实现UIText作为标签显示在物体上面
*	Description:
*		功能:XXX
*	Date:2017
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

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

namespace SimpleUIFrame
{
	public class Test_DriftingSpecialEffect : MonoBehaviour
	{
        private GameObject _TargetObj;                          //目标对象
        private Camera _WorldCamera;                            //世界坐标系
        private Camera _GUICamera;                              //UI坐标系
        private Text _Text;                                     //显示文本

        public float width=1F;
        public float height=1F;
        public float offset = 1.5F;


        //设置UI文本放置的目标
        public void SetTargetObj(GameObject go)
        {
            _TargetObj = go;
        }

        private void Start()
        {
            //获取文本控件
            _Text = this.gameObject.GetComponent<Text>();
            //世界摄像机
            _WorldCamera = Camera.main.gameObject.GetComponent<Camera>();
            //UI摄像机
            _GUICamera = GameObject.FindGameObjectWithTag("Tag_UICamera").GetComponent<Camera>();
            //指定UI文本显示位置
            Pos();
            //参数检查
            if (_TargetObj==null)
            {
                Debug.LogError(GetType()+ "Start()/_TargetObj is null, Please Check!!!");
                return;
            }
           
        }

        private void Update()
        {
            //_Text.transform.localScale = new Vector3(width,height,0);
        }

      

        /// <summary>
        ///动态指定UI文本的显示位置
        /// </summary>
        private void LateUpdate()
        {
            ////指定UI文本显示位置
            //Pos();
        }


        /// <summary>
        /// 指定UI文本显示位置
        /// </summary>
        private void Pos()
        {
            if (_TargetObj != null)
            {
                //获取目标物体的屏幕坐标
                Vector3 pos = _WorldCamera.WorldToScreenPoint(_TargetObj.transform.position);
                //屏幕坐标转换为UI的世界坐标
                pos = _GUICamera.ScreenToWorldPoint(pos);
                //确定UI最终位置
                pos.z = 0;
                this.transform.position = new Vector3(pos.x, pos.y + offset, pos.z);
                //动态调整UI文本的大小
                _Text.transform.localScale = new Vector3(width, height, 0);
            }
        }

    }
}

三、编写控制Text显示的脚本(Test_UIText)
/***
*	Title:"XXX" 项目
*		主题:XXX
*	Description:
*		功能:XXX
*	Date:2017
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

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

namespace SimpleUIFrame
{
	public class Test_UIText : MonoBehaviour
	{
        public GameObject Panel;                         //UI文本显示的面板
        public GameObject go;

		void Start()
		{
			
		}

        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.A))
            {
                //加载UI文本预设
                Object OT = Resources.Load("Prefabs/Text");
                GameObject UIText = Instantiate(OT) as GameObject;
                UIText.GetComponent<Text>().text = "这个一个测试显示";
                //指定该UI文本的父物体
                UIText.transform.parent =Panel.transform;
                //指定UI文本显示的目标物体
                UIText.GetComponent<Test_DriftingSpecialEffect>().SetTargetObj(go);
            }
        }
    }
}

四、将关于Text显示标签的脚本(Test_DriftingSpecialEffect)添加给面板中的Text,然后将该Text作为预制体
五、给面板中的_ScriptsMgr添加控制Text显示的脚本(Test_UIText)
六、运行场景,然后开启键盘大写,按下“A”键,即可看到该Text标签显示在Capsule物体上面

2018-06-06 16:17:29 qq_40348469 阅读数 477
  • Unity 值得看的500+ 技术内容列表

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

原帖:http://www.cnblogs.com/fengrenyuan/p/3729642.html


昨晚,好友在电话里问我在Unity3d中使用3D Text,不想让其穿透模型显示,即想让场景中的3D Text与模型有正确的遮挡关系,怎么解?

今早谷歌上查了查,明白了原因,因为3D Text的默认材质的shader是GUI/Text Shader(自然就有了GUI的穿透显示的特性),而且不可以去手动更改。

记录解决方式如下:

1、自己写个想要的shader,并建个使用它的材质球;

2、导入自己的中文字体;

3、替换掉3D Text上的默认材质球。

 

首先,搭建一个好友在电话里描述的场景;

 

新建一个shader,命名为3D Text Shader,并在其中贴上以下代码:

复制代码
Shader "Custom/3D Text Shader" {
    Properties {
        _MainTex ("Font Texture", 2D) = "white" {}
        _Color ("Text Color", Color) = (1,1,1,1)
    }


    SubShader {
        Tags{ "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        Lighting Off Cull Off ZWrite On Fog { Mode Off }
        Blend SrcAlpha OneMinusSrcAlpha
        Pass {
            Color [_Color]
            SetTexture [_MainTex] {
                combine primary, texture * primary
            }
        }
    }
}
复制代码

给一个截图:

新建一个Material,并指定上刚写的shader;

下一步是导个字体文件进来,去控制面板的字体路径中,找一个喜欢的中文字体复制到Unity3d的Assets文件夹中,我复制了一个黑体过来;

回到Unity3d中,把字体文件的Character选项改为Unicode,这样字体文件下面的那张Font Texture就会出现密密麻麻地文字;

最后,选中场景中的需要被正确遮挡的3D Text物体,进行以下3个操作,就完成了:

1、字体文件拖给Text Mesh组件中的Font;

2、刚才自己建的材质球拖给Mesh Renderer组件中的Element 0;

3、字体下的Font Texture拖给材质球。

如图:

 

PS:

1、如果要调整字体颜色,3D Text中的Color属性已经失效,需要去调整那个自己建的材质球的Text Color;

2、关于字体,如果无视内存占用的话,字体就去控制面板里面的字体随便复制来用,否则,想做到最优的话,建议去网上找那个三四千字的精简字库。

2017-05-15 08:11:10 MoMoLily 阅读数 7242
  • Unity 值得看的500+ 技术内容列表

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

public override void OnPointerMove(Vector3 postion)
{

if (wallhight == null)
{
wallhight = new GameObject("wallhight");
wallhight.AddComponent<TextMesh>();
Camera = GameObject.Find("Main Camera");
}
high = (int)DeviceInfo.target.transform.localScale.y;
wallhight.GetComponent<TextMesh>().text = high.ToString();
wallhight.transform.position = new Vector3(postion.x, postion.y + 0.5f, postion.z);
wallhight.GetComponent<TextMesh>().color = Color.black;
wallhight.GetComponent<TextMesh>().characterSize = 0.3f;
wallhight.transform.LookAt(Camera.transform);

}

这是我自己关于画墙的一个高度的显示,具体的可以去参考官方手册。重要的其实只有这一句:GetComponent<TextMesh>().Text="";

2017-05-25 19:52:31 honey199396 阅读数 3560
  • Unity 值得看的500+ 技术内容列表

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

Unity3D中使用3D Text(Text Mesh)时,如何让场景中的物体和3D Text有正确的遮挡关系。由于3D Text默认材质是(Font Material),他的shader是GUI/Text Shader,自然也就有了GUI的穿透特性,所以我们使用自定义材质就可以解决这个问题了。
1、新建材质,并将如下shader设置给它

Shader "Custom/3D Text Shader" {
    Properties {
        _MainTex ("Font Texture", 2D) = "white" {}
        _Color ("Text Color", Color) = (1,1,1,1)
    }

    SubShader {
        Tags{ "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        Lighting Off Cull Off ZWrite On Fog { Mode Off }
        Blend SrcAlpha OneMinusSrcAlpha
        Pass {
            Color [_Color]
            SetTexture [_MainTex] {
                combine primary, texture * primary
            }
        }
    }
}

2、导入一个字体,并将Character设置为Unicode。并将生成的图片设置给Shader
这里写图片描述
这里写图片描述
3、将3D Text的材质替换成自定义的材质
这里写图片描述
注意:如果要调整字体颜色,3D Text中的Color属性已经失效,需要去调整那个自己建的材质球的Text Color;

2017-10-23 14:16:39 qq_33994566 阅读数 2884
  • Unity 值得看的500+ 技术内容列表

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

unity3D项目中很多需要配置文件,对于一些简单的配置,我们可以用text文件来保存我们的配置数据。下面是我的解析代码:

using System;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;

public class LoadText
{
    public static string textPath = Application.streamingAssetsPath + "/Parama.txt";
 
    public static string[] LoadText1()
    {
        byte[] dataBytes=new byte[100];
        string[] dataList=new string[19];
        try
        {
            FileStream file = new FileStream(textPath, FileMode.Open);
            file.Seek(0, SeekOrigin.Begin);
            file.Read(dataBytes, 0, 100);
            string s = Encoding.Default.GetString(dataBytes);
            dataList=s.Split(',');
            file.Close();
            return dataList;
        }
        catch (Exception)
        {
            throw;
        }
    }
}

c#的流形式用完一定要关闭。否则会报错。

还有一个做测试用的,我们把输出信息保存到文本里可以看到程序运行情况。上代码:

 public void Save(string information)
    {
        Debug.Log("Save");
        string path = Application.streamingAssetsPath + @"/TestText.txt";
        FileStream aFile;
        if (!File.Exists(path))
        {
            aFile = new FileStream(path, FileMode.OpenOrCreate);
        }
        else
        {
            aFile = new FileStream(path, FileMode.Append);
        }
        StreamWriter sw = new StreamWriter(aFile);
        sw.Write(information);
        sw.Close();
        sw.Dispose();
    }