2019-04-11 16:29:30 qq_34888164 阅读数 139
  • Unity 值得看的500+ 技术内容列表

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

Unity3d使用鼠标点击控制人物走动无效的问题

最近在自学Unity3d,在学到使用鼠标点击控制人物走动时,按照API上面将代码写好,如下:

void Update () {

	//	_clickListener.Update();

		if (Input.GetMouseButtonUp (0)) {
  
			ClickOn(Input.mousePosition);
		}

	}

void ClickOn(Vector2 pos)
	{
		if (player == null)
			return;
		Ray ray = this.GetComponent<Camera>().ScreenPointToRay(pos);
		RaycastHit[] hits = Physics.RaycastAll(ray);

	
		foreach (RaycastHit hit in hits){
			BoxCollider bc = hit.collider as BoxCollider;
            Debug.Log("bc.name is " + bc.name);
            Debug.Log("bc.name is Contains floor  " + bc.name.Contains("floor"));
			if (bc != null && bc.name.Contains("floor") && player != null){
             
			player.GetComponent<Player>().WalkTo(hit.point);
				break;
			}
		}
	}

检查下,没什么错误,Unity3d,点击运行,满以为接下来可以美滋滋的用鼠标控制人物走动了,想想还有点小激动呢!结果点击鼠标,毫无响应!!!!

what fuck?

代码咋回事?写错了吗,于是又反复的检查了一下代码,确认是没问题的。代码既然是没问题,但是又没有达到相应的功能,到底怎么回事呢?

遇到这样的情况第一想到的是肯定是有哪段代码没有执行,从以上代码来看,只有3个地方涉及到了判断逻辑,分别是:if (Input.GetMouseButtonUp (0)) 和foreach (RaycastHit hit in hits) 以及 if (bc != null && bc.name.Contains(“floor”) && player != null)。

先说第一个if (Input.GetMouseButtonUp (0)) :
这是用来判断是否点击了鼠标左键的判断,如果鼠标左键被点击,那么Input.GetMouseButtonUp (0)返回的则是true;
在以上的代码上的对应地方加上打印,最终代码如下:

if (Input.GetMouseButtonUp (0)) {
            Debug.Log("the Mouse button has been press");
			ClickOn(Input.mousePosition);
		}

OK,运行,鼠标左键点击,发现Unity控制台打印为:
在这里插入图片描述
确实收到了鼠标的点击事件,那么确认第一个判断正确的可以pass掉,接下来看第二个逻辑foreach (RaycastHit hit in hits)
这句逻辑是用从射线碰撞点的数组中(具体可以百度)进行遍历的数组,在foreach (RaycastHit hit in hits) 里面加个打印,如下:

foreach (RaycastHit hit in hits){
            Debug.Log("hits has been in ");
			BoxCollider bc = hit.collider as BoxCollider;
          
            Debug.Log("bc.name is Contains floor  " + bc.name.Contains("floor"));
			if (bc != null && bc.name.Contains("floor") && player != null){
             
			player.GetComponent<Player>().WalkTo(hit.point);
				break;
			}
		}

运行,没有执行打印。所以说明foreach语句里面的循环没有被执行,所以说明hits的数组长度为0.
再看:

   Ray ray = this.GetComponent<Camera>().ScreenPointToRay(pos);
    		RaycastHit[] hits = Physics.RaycastAll(ray);

如果hits长度为0,则只能说明 Physics.RaycastAll(ray);拿到的数据为空。
为什么这句会拿到空,首先了解Physics.RaycastAll(ray)该方法return一个数组。ray代表射线,即拿到射线上的所有碰撞点,如果获取的数组为0.则毫无意义是因为没有碰撞器造成的。
搞明白这个问题后,继续回去检查GameObject的Component看有没有添加碰撞器。果然还没加,是这样的:

在这里插入图片描述
没有加就加一个,点击“Add Component” 加一个,如下图:

在这里插入图片描述
添加好之后,保存。继续运行,点击鼠标还是不动。。。。,几乎要放弃的,但是程序员有程序员的倔强。之前两个都解决了,所以再检查第三个 if (bc != null && bc.name.Contains(“floor”) && player != null),继续加Debug日志,发现bc.name.Contains(“floor”)这一句一直返回false,说明碰撞点的对象名字不包含"floor"。找到对应的gameObject,如下图:
在这里插入图片描述
默认的名字都不含有"floor",好吧 改名字呗!不用全部改,只用将地板的模型gameObject改成含有"floor"即可,比如我的,就只改了3个:
在这里插入图片描述
改完之后,运行,完美,可以走动了!
在这里插入图片描述

在这里插入图片描述
第一次写CSDN还不会传动态度,呵呵!
最后说一下,这些素材的都是从网上下载下来导入到工程里面的,里面很多默认的东西没有创建或改名,刚学习接触Unity3d,跟着教程视频,视频讲解老师略过了一些步骤后,就会发现自己没法实现视频上的效果,唉。。。没基础就是不行,好在有因为有其他编程语言的基础,有程序员的职业技能,哈哈,不错就是调试。emmm,仅以此文献给在编程领域摸滚打爬的程序员们,共勉!!!

2016-12-16 10:59:22 KathyKarol 阅读数 1887
  • Unity 值得看的500+ 技术内容列表

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

 作为一个新人,我也来发表一篇文章,大早上的通过unity3d来给大家分享一下我自己做的小demo;


首先获取鼠标在屏幕上点击的那个点的坐标,在这里要用到input类中的MouseButtonDown()这个方法来获得鼠标的左键,右键已经滚轮的点击反应。

今天我们就用左键吧,在MouseButtonDown()这个方法里,使用参数0来表示按下左键,;使用MouseButtonUp(0)方法来表示释放左键,因为在屏幕

中是要拖动的,所以需要持续按下鼠标的函数GetMouseButton(0);这三个函数我们都放在Update里面执行;




在这里我们使用unity自带的画图类库来对鼠标点击并且拖动形成的范围进行画图,我们使用类GL中的一些方法,如PushMatrix()、LoadPixelMatrix(),以及开始画图的点和结束画图的点的函数,在这里就不一一介绍啦,待会直接上传代码就好了。


当鼠标点击拖动,形成的区域肯定是矩形,所以这边涉及上下左右边框的计算,我们使用一个材质来表示,


最后,当鼠标左键施放之后,所形成的区域就在屏幕中释放,我们使用GL中的PopMatrix()函数来表示结束;


下面是我这个demo的源代码,给大家分享一下:

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


public class GetRange : MonoBehaviour {


    private Vector2 mouseStartPos, mouseEndPos;
    private bool mBDrawMouseRect;


    public Material rectMat;//画线的材质


    void Start()
    {
        mBDrawMouseRect = false;
    }


    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        //按下鼠标左键  
        {
            Vector3 mousePosition = Input.mousePosition;
            mouseStartPos = new Vector2(mousePosition.x, mousePosition.y);
        }


        if (Input.GetMouseButton(0))
        //持续按下鼠标左键  
        {
            mBDrawMouseRect = true;
            Vector3 mousePosition = Input.mousePosition;
            mouseEndPos = new Vector2(mousePosition.x, mousePosition.y);
        }


        if (Input.GetMouseButtonUp(0))
        {
            mBDrawMouseRect = false;
        }
    }


    void OnGUI()
    {
        if (mBDrawMouseRect)
            Draw(mouseStartPos, mouseEndPos);
        GUILayout.Label("X:"+Input.mousePosition.x);
        GUILayout.Label("Y:" + Input.mousePosition.y);
    }


    //渲染2D框  
    void Draw(Vector2 start, Vector2 end)
    {
        rectMat.SetPass(0);
        


        GL.PushMatrix();//保存摄像机变换矩阵  


        Color clr = Color.green;
        clr.a = 0.1f;


        GL.LoadPixelMatrix();//设置用屏幕坐标绘图  
                             //透明框  
        GL.Begin(GL.QUADS);
        GL.Color(clr);
        GL.Vertex3(start.x, start.y, 0);
        GL.Vertex3(end.x, start.y, 0);
        GL.Vertex3(end.x, end.y, 0);
        GL.Vertex3(start.x, end.y, 0);
        GL.End();


        //线  
        //上  
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        GL.Vertex3(start.x, start.y, 0);
        GL.Vertex3(end.x, start.y, 0);
        GL.End();


        //下  
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        GL.Vertex3(start.x, end.y, 0);
        GL.Vertex3(end.x, end.y, 0);
        GL.End();


        //左  
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        GL.Vertex3(start.x, start.y, 0);
        GL.Vertex3(start.x, end.y, 0);
        GL.End();


        //右  
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        GL.Vertex3(end.x, start.y, 0);
        GL.Vertex3(end.x, end.y, 0);
        GL.End();


        GL.PopMatrix();//还原  
    }


}

2017-11-25 10:57:08 q764424567 阅读数 1131
  • Unity 值得看的500+ 技术内容列表

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

Unity3D 鼠标手势的左右滑动

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;  
        }  
    }  
}  
2017-05-17 16:17:00 yongh701 阅读数 3759
  • Unity 值得看的500+ 技术内容列表

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

Unity3D改变鼠标样式很简单,直接就封装好方法,以满足在游戏里面定制自己的鼠标样式的需求。下面举一个例子来说明这个问题。我需要将光标改成如下的形状:


注意这张图片是经过处理的png,白色的地方都用photoshop抠成透明了。

要在游戏里面实现如下的效果:


将a.png导入Unity3D,可以在主摄像机挂载如下的脚本CursorChange.cs:

using UnityEngine;
using System.Collections;

public class CursorChange : MonoBehaviour
{
    public Texture2D cursorTexture;
    void Start()
    {
        Cursor.SetCursor(cursorTexture, Vector2.zero, CursorMode.Auto);
    }
}
之后将导入的a.png设置为不压缩、完全保真:


再赋予给CursorChange.cs中的Texture2D cursorTexture即可:

这里脚本就一行,就要是3个参数,第1个参数cursorTexture大家已经知道是什么了,第2个参数Vector2.zero,也就是二维坐标(0,0)是指取材质图片a.png的左上角作为点击点:


第3个参数CursorMode.Auto是指渲染形式,Audo为平台自适应显示,支持此样式则显示,不支持不显示。ForceSoftware强制平台显示此样式。这东西发布到安卓平台应该会隐藏的。

2017-10-17 09:08:58 q764424567 阅读数 4962
  • Unity 值得看的500+ 技术内容列表

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

Unity3d鼠标拖拽物体实现任意角度自旋转

主要涉及函数

Input.GetAxis("Mouse X");//可取得鼠标横向(x轴)移动增量
Input.GetAxis("Mouse Y");//可取得鼠标竖向(y轴)移动增量

效果图

在这里插入图片描述

代码分享

using UnityEngine;

public class startRoate : MonoBehaviour
{
	private bool onDrag = false;  //是否被拖拽    
	public float speed = 6f;      //旋转速度    
	private float tempSpeed;      //阻尼速度 
	private float axisX = 1;      //鼠标沿水平方向移动的增量   
	private float axisY = 1;      //鼠标沿竖直方向移动的增量   
	private float cXY;

	void OnMouseDown()
	{
		//接受鼠标按下的事件// 
		axisX = 0f; axisY = 0f;
	}
	void OnMouseDrag()     //鼠标拖拽时的操作// 
	{
		onDrag = true;
		axisX = -Input.GetAxis("Mouse X");
		//获得鼠标增量 
		axisY = Input.GetAxis("Mouse Y");
		cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度//
		if (cXY == 0f) { cXY = 1f; }
	}
	//计算阻尼速度
	float Rigid()      
	{
		if (onDrag)
		{
			tempSpeed = speed;
		}
		else
		{
			if (tempSpeed > 0)
			{
				//通过除以鼠标移动长度实现拖拽越长速度减缓越慢
				tempSpeed -= speed * 2 * Time.deltaTime / cXY; 
			}
			else
			{
				tempSpeed = 0;
			}
		}
		return tempSpeed;
	}

	void Update()
	{
		//这个是是按照之前方向一直慢速旋转
		this.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World); 
	}
}
没有更多推荐了,返回首页