2016-02-18 10:17:09 wuyt2008 阅读数 11866

先上代码

using UnityEngine;
using System.Collections;

public class WebCamManager : MonoBehaviour {

	// Use this for initialization
	void Start () {

		WebCamTexture webcamTexture = new WebCamTexture ();

		//如果有后置摄像头,调用后置摄像头
		for (int i = 0; i < WebCamTexture.devices.Length; i++) {
			if (!WebCamTexture.devices [i].isFrontFacing) {
				webcamTexture.deviceName = WebCamTexture.devices [i].name;
				break;
			}
		}

		Renderer renderer = GetComponent<Renderer>();
		renderer.material.mainTexture = webcamTexture;
		webcamTexture.Play();
	}

}


在场景里面添加一个plane


调整plane的位置,并把脚本拖上去,运行就可以了。



如果是要在GUITexture上显示,则代码如下:

using UnityEngine;
using System.Collections;

public class WebCamManager : MonoBehaviour {

	// Use this for initialization
	void Start () {

		WebCamTexture webcamTexture = new WebCamTexture ();

		//如果有后置摄像头,调用后置摄像头
		for (int i = 0; i < WebCamTexture.devices.Length; i++) {
			if (!WebCamTexture.devices [i].isFrontFacing) {
				webcamTexture.deviceName = WebCamTexture.devices [i].name;
				break;
			}
		}

		GUITexture guiTexture = GetComponent<GUITexture> ();
		guiTexture.texture = webcamTexture;
		webcamTexture.Play ();
	}
}


如果在本机调试的时候出现以下错误提示

Cannot use web cam, since the user has not authorized this!

这是没有使用摄像头的权限,build一次安卓应用再试就好了,或者使用以下代码,先判断权限

using UnityEngine;
using System.Collections;

public class WebcamManager : MonoBehaviour {

	// Use this for initialization
	void Start () {
		StartCoroutine ("CallWebCam");
	}

	IEnumerator CallWebCam(){
		yield return Application.RequestUserAuthorization (UserAuthorization.WebCam);

		if (Application.HasUserAuthorization (UserAuthorization.WebCam)) {
			WebCamTexture webcamTexture = new WebCamTexture ();  

			//如果有后置摄像头,调用后置摄像头  
			for (int i = 0; i < WebCamTexture.devices.Length; i++) {  
				if (!WebCamTexture.devices [i].isFrontFacing) {  
					webcamTexture.deviceName = WebCamTexture.devices [i].name;  
					break;  
				}  
			}  

			GUITexture guiTexture = GetComponent<GUITexture> ();  
			guiTexture.texture = webcamTexture;  
			webcamTexture.Play ();  
		} else {
			Debug.Log ("has not authorization");
		}
	}
	

}



2015-10-23 15:51:55 a117653909 阅读数 4328

我觉得要真正地理解四元数是把Unity3D里四元数函数都上手测试一下其功能。
四元数在Unity3D中的作用就是拿来表示旋转。

AngleAxis
创建一个旋转,绕着某个轴旋转,返回结果是一个四元数。
跟ToAngleAxis实现的是相反的功能。

Angle
返回两个旋转值(四元数)之间的角度,返回值是float类型的角度值。
(不知道这个值算出来后有什么用)

Dot
点乘,我也不太理解其意义。
参见

eulerAngles
返回表示旋转的欧拉角度(Vector3 即3个值)
(如果调用的是某个物体,则表示该物体当前位置是从原始位置怎么旋转过来的,
其实就是Inspector里的Rotation的3个值)

Euler
感觉跟eulerAngles是相反的操作(经测试,确实是)
输入的是欧拉角的3个值,返回的是一个旋转(四元数)

FromToRotation
参数是两个Direction(Vector3),返回一个Quaternion
我觉得主要是用在要把A物体的朝向转成跟B物体的朝向一样时所需要的旋转值(Quaternion)
然后再调用Transform.Rotate就可以把A旋转成跟B一样了。

identity
可以理解为单位四元数

Inverse
就是一个旋转的反旋转,其实就是把刚才的那个旋转转回去。

Lerp
插值,可以理解为可以把一个物体的朝向转向跟另一个物体一样,跟时间配合可以慢慢地旋转。

LookRotation
可以让A物体一直朝向B物体。
参照下面这篇文章的做法,导入ThirdPersonController
http://blog.csdn.net/lijing_hi/article/details/7272089

Quaternion
构造函数,参数是4个float值

RotateTowards
跟Slerp类似

SetFromToRotation
跟FromToRotation功能一样,只是调用方式不一样。

SetLookRotation
跟LookRotation功能一样,只是调用方式不一样。

Slerp
旋转一个角度从from到to。

this[int index]
像数组那样调用x, y, z, w,感觉还不如直接用.x来调用。
可能是为了循环方便。

ToAngleAxis
把一个rotation 转成 angle-axis 形式。跟AngleAxis实现的是相反的功能。
用引用的方式传入 angle和 axis 。
这跟transform.localEulerAngles很类似。
输入:transform.localEulerAngles=(0,0,0);
输出:angle=0, axis=(1,0,0);
输入:transform.localEulerAngles=(0,90,0);
输出:angle=90,axis=(0,1,0);
输入:transform.localEulerAngles=(270,0,0);
输出:angle=90,axis=(-1,0,0)

ToString
格式化成一个字符串

参考:http://blog.csdn.net/yustarg/article/details/8623687

2017-09-25 23:25:01 q764424567 阅读数 1839
public class CameraController : MonoBehaviour

{

public Camera cam;

public Transform hero;

public bool movable;

public float velocity = 4;

public bool follow;

private Vector3 pivot = new Vector3(0,0,0);

public bool lockCursor = false; //no mouse 1 reqired

public float elevation = 1.5f;

public float sensitivity = 1f;



private float rotationX = 0;

private float rotationY = 190;

public void Start ()

{

if (cam==null) cam = Camera.main;

//if (hero==null) hero = ((CharController)FindObjectOfType(typeof(CharController))).transform;

pivot = cam.transform.position;

}

public void LateUpdate () //updating after hero is moved and all other scene changes made

{

//locking cursor

if (lockCursor)

{

Cursor.lockState = CursorLockMode.Locked;

Cursor.visible = false;

}

else

{

Cursor.lockState = CursorLockMode.None;

Cursor.visible = true;

}

//reading controls

if (Input.GetMouseButton(1) || lockCursor)

{

rotationY += Input.GetAxis("Mouse X")*sensitivity; //note that axises from screen-space to world-space are swept!

rotationX -= Input.GetAxis("Mouse Y")*sensitivity;

rotationX = Mathf.Min(rotationX, 89.9f);

}

//setting cam

if (hero!=null) pivot = hero.position + new Vector3(0, elevation, 0);

//moving

if (movable)

{

if (Input.GetKey (KeyCode.W)) pivot += transform.forward * velocity * Time.deltaTime;

if (Input.GetKey (KeyCode.S)) pivot -= transform.forward * velocity * Time.deltaTime;

if (Input.GetKey (KeyCode.D)) pivot += transform.right * velocity * Time.deltaTime;

if (Input.GetKey (KeyCode.A)) pivot -= transform.right * velocity * Time.deltaTime;

}

cam.transform.localEulerAngles = new Vector3(rotationX, rotationY, 0); //note that this is never smoothed

cam.transform.position = pivot;

}

}

 

Unity3d
2019-11-20 17:37:03 gao15012211596 阅读数 18

Unity3d

血条(Health Bar)的预制设计。具体要求如下:

  • 分别使用 IMGUI 和 UGUI 实现
  • 使用 UGUI,血条是游戏对象的一个子元素,任何时候需要面对主摄像机
  • 分析两种实现的优缺点
  • 给出预制的使用方法

IMGUI实现

IMGUI,即时模式图形界面,它是代码驱动的UI系统,没有图形化设计界面,只能在OnGUI阶段用GUI系列的类绘制各种UI元素,因此UI元素只能浮在游戏界面上。

IMGUI主要应用于以下场景:

  • 在游戏中创建调试显示工具
  • 为脚本组件创建自定义的 Inspector 面板
  • 创建新的编辑器窗口和工具来扩展 Unity 环境

IMGUI系统通常不打算用于玩家可能使用并与之交互的普通游戏内用户界面。

步骤:

  1. 创建空对象,命名为HealthSlider。

  2. 创建脚本IMGUI.cs,主要的思路是在界面上生成两个按钮,分别为“加血”和“减血”,再生成一个HorizontalScrollbar(水平滚动条),用来作为血条的原型。每按下“加血”按钮,血条的值增加0.1,每按下“减血”按钮,血条的值减少0.1。最高血量值为1,最少为0.

    代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class IMGUI : MonoBehaviour {
        //血条位置
        private Rect healthPos; 
        //加血按钮位置
        private Rect upPos;
        //减血按钮位置
        private Rect downPos; 
        //当前血量
        private float health = 0.0f; 
        //加/减血之后的血量
        private float newHealth; 
    
        // Use this for initialization
        void Start () {
            healthPos = new Rect(200, 80, 100, 20);
            upPos = new Rect(100, 80, 40, 20);
            downPos = new Rect(150, 80, 40, 20);
            //开始的时候新的血量等于0
            newHealth = health;
        }
    
        // Update is called once per frame
        void Update () {
    
        }
        private void OnGUI()
        {
            if (GUI.Button(upPos, "加血"))
            {
                //血量最多为1,每次加0.1
                newHealth = health + 0.1f > 1.0f ? 1.0f : health + 0.1f;
            } else if (GUI.Button(downPos, "减血"))
            {
                //血量最低为0,每次减0.1
                newHealth = health - 0.1f < 0 ? 0.0f: health - 0.1f;
            }
            //用Mathf.Lerp()函数插值计算health,使得血条值平滑变化,而不是突变。
            health = Mathf.Lerp(health, newHealth, 0.05f);
            GUI.HorizontalScrollbar(healthPos, 0, health, 0, 1);
        }
    }
    
    1. 将脚本挂载到对象HealthSlider上,运行效果如下:

在这里插入图片描述

UGUI实现

UGUI 是面向对象的 UI 系统。所有 UI 元素都是游戏对象,友好的图形化设计界面, 可在场景渲染阶段渲染这些 UI 元素。

步骤:

  1. 在层次视图,Context 菜单 -> 3D Object -> Plane 添加 Plane 对象

  2. 在Asset Store中搜索Standard assets,导入资源,这里我们主要使用的是Character,不过最好把其他的也导入,不然可能会报错。有一些导入的cs脚本会报错,把那些脚本删掉就好。

  3. 资源视图展开 Standard Assets :: Charactors :: ThirdPersonCharater :: Prefab

  4. 将 ThirdPersonController 预制拖放放入场景,改名为 Ethan

  5. 检查以下属性

    • Plane 的 Transform 的 Position = (0,0,0)
    • Ethan 的 Transform 的 Position = (0,0,0)
    • Main Camera 的 Transform 的 Position = (0,1,-10)
  6. 运行检查效果,此时可以看到Ethan站在Plane的中心,从Game场景中看,视野良好。

  7. 选择 Ethan 用上下文菜单 -> UI -> Canvas, 添加画布子对象

  8. 选择 Ethan 的 Canvas,用上下文菜单 -> UI -> Slider 添加滑条作为血条子对象

  9. 运行检查效果

  10. 选择 Ethan 的 Canvas,在 Inspector 视图

    • 设置 Canvas 组件 Render Mode 为 World Space
    • 设置 Rect Transform 组件 (PosX,PosY,Width, Height) 为 (0,2,160,20)
    • 设置 Rect Transform 组件 Scale (x,y) 为 (0.01,0.01)
  11. 运行检查效果,此时可以看到头顶 Slider 的 Ethan,用键盘移动 Ethan,可以看到血条随着人物移动。

  12. 展开 Slider

    • 选择 Handle Slider Area,禁灰(disable)该元素
    • 选择 Background,禁灰(disable)该元素
    • 选择 Fill Area 的 Fill,修改 Image 组件的 Color 为 红色
  13. 选择 Slider 的 Slider 组件

    • 设置 MaxValue 为 100
    • 设置 Value 为 75
  14. 运行检查效果,发现血条变为红色,随人物旋转。

  15. 为了使血条始终对着屏幕,给 Canvas 添加以下脚本 LookAtCamera.cs:

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

public class LookAtCamera : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        this.transform.LookAt(Camera.main.transform.position);
    }
}

效果如下:
在这里插入图片描述

分析两种实现的优缺点

IMGUI

优点:

  • IMGUI 符合游戏编程的传统
  • 在修改模型,渲染模型这样的经典游戏编程模式中,在渲染阶段之后,绘制UI界面无可挑剔。
  • 这样的编程既避免了UI元素保持在屏幕最前端,又有最佳的执行效率,一切控制掌握在程序员手中,这对早期计算和存储资源贫乏的游戏设备来说,更是弥足珍贵。
  • 适用于以下场景:
    • 在游戏中创建调试显示工具
    • 为脚本组件创建自定义的 Inspector 面板
    • 创建新的编辑器窗口和工具来扩展 Unity 环境

缺点:

  • 它是代码驱动的 UI 系统,没有图形化设计界面,只能在 OnGUI 阶段用 GUI 系列的类绘制各种 UI 元素,因此 UI元素只能浮在游戏界面之上。
  • 开发效率低下,难以调试。
  • IMGUI系统通常不适用于玩家可能使用并与之交互的普通游戏内用户界面。

UGUI

优点:

  • UGUI 是面向对象的 UI 系统。所有 UI 元素都是游戏对象,友好的图形化设计界面, 可在场景渲染阶段渲染这些 UI 元素。
  • 设计师甚至不需要程序员帮助,使用这些工具就可直接创造游戏元素,乃至产生游戏程序。
  • 跨设备执行,自动适应不同分辨率
  • UI 元素与游戏场景融为一体的交互
  • 支持复杂的布局
  • 所见即所得(WYSIWYG)设计工具
  • 支持多模式、多摄像机渲染
  • 面向对象的编程

预制的使用方法

  • 在Assets文件夹中创建Prefabs文件夹
  • 将IMGUI的HealthSlider拖入Prefabs文件夹中,此时HealthSlider就变成了预制体
  • 将Canvas拖入Prefabs文件夹中,此时Canvas也变成了预制体
  • prefab只有两种使用方法,一是在代码里调用Instantiate;另一种是拖到场景里产生一个和他关联的物体(在Hierarchy里显示蓝色)。

视频链接

github地址

2017-09-12 17:25:00 Lyon_Nee 阅读数 1166

将脚本直接挂在当前想要通过手势旋转的摄像头或其他游戏物体上.


using UnityEngine;

public class TouchTest : MonoBehaviour
{
    public float xSpeed = 100;//旋转速度
    public float ySpeed = 100;
    public float yMinLimit = -20;//旋转限制
    public float yMaxLimit = 80;
    public float x = 0.0f;
    public float y = 0.0f;
    void Start()
    {
        Vector2 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
    }

    void Update()
    {
        if (Input.touchCount == 1)
        {
            if (Input.GetTouch(0).phase==TouchPhase.Moved)
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            }
        }
    }

    public void LateUpdate()
    {
        y = ClampAngle(y, yMinLimit, yMaxLimit);
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        transform.rotation = rotation;

    }

    /// <summary>
    /// Y值的限制
    /// </summary>
    float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;

        if (angle > 360)
            angle -= 360;

        return Mathf.Clamp(angle, min, max);
    }
}


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