2019-03-18 18:40:50 qq_36772866 阅读数 1004
  • 老孙的游戏课:第2篇 人机交互

    本课是“老孙游戏课”系列课程的第2篇,该课程重点介绍Unity中的人机交互功能,以游戏实例为背景,深入浅出地讲解键盘操作、鼠标操作、碰撞检测、血条制作等多个游戏中常用的交互变换功能。

    12 人正在学习 去看看 孙博文

当鼠标按键按下时,返回一次true,后面参数0是左键,1是右键,2是中键

if(Input.GetMouseButtonDown(0))
			Debug.Log("Pressed left click.");
		if(Input.GetMouseButtonDown(1))
			Debug.Log("Pressed right click.");
		if(Input.GetMouseButtonDown(2))
			Debug.Log("Pressed middle click.");

当鼠标按键按下时,返回true,可能多次,根据你鼠标按下的时间 ,后面参数0是左键,1是右键,2是中键

if(Input.GetMouseButton(0))
			Debug.Log("Pressed left click.");
		if(Input.GetMouseButton(1))
			Debug.Log("Pressed right click.");
		if(Input.GetMouseButton(2))
			Debug.Log("Pressed middle click.");

当鼠标按键按下后弹起时,返回一次true,后面参数0是左键,1是右键,2是中键

if(Input.GetMouseButtonUp(0))
			Debug.Log("Pressed left click.");
		if(Input.GetMouseButtonUp(1))
			Debug.Log("Pressed right click.");
		if(Input.GetMouseButtonUp(2))
			Debug.Log("Pressed middle click.");
2013-07-20 14:59:28 a2587539515 阅读数 3218
  • 老孙的游戏课:第2篇 人机交互

    本课是“老孙游戏课”系列课程的第2篇,该课程重点介绍Unity中的人机交互功能,以游戏实例为背景,深入浅出地讲解键盘操作、鼠标操作、碰撞检测、血条制作等多个游戏中常用的交互变换功能。

    12 人正在学习 去看看 孙博文

账号被盗,文章被修改,博主已将博文删除

2019-12-21 15:38:04 zhunju0089 阅读数 141
  • 老孙的游戏课:第2篇 人机交互

    本课是“老孙游戏课”系列课程的第2篇,该课程重点介绍Unity中的人机交互功能,以游戏实例为背景,深入浅出地讲解键盘操作、鼠标操作、碰撞检测、血条制作等多个游戏中常用的交互变换功能。

    12 人正在学习 去看看 孙博文

需求:制作一个鼠标中键移动缩放和鼠标右键旋转的功能(鼠标右键旋转可以自行改成鼠标左键旋转)

效果图:

1.新建一个名为Target的立方体cube

2.新建一个材质球 Yellow颜色的并挂载到Target立方体上

 

3.新建一个脚本 MatrixAction.cs

4.MatrixAction.cs代码

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

public class MatrixAction : MonoBehaviour
{
    [Header("操作对象")]
    /// <summary>
    /// 操作对象
    /// </summary>
    public Transform m_target;
    void Start()
    {
        isDown1 = false;
        isDown2 = false;
    }
    /// <summary>
    /// 右键是否按下 
    /// </summary>
    private bool isDown1;

    /// <summary>
    /// 中键是否按下
    /// </summary>
    private bool isDown2;
    void Update()
    {
        // 按下了鼠标中键
        if (Input.GetMouseButtonDown(1))
            isDown1 = true;
        // 抬起了鼠标中键
        if (Input.GetMouseButtonUp(1))
            isDown1 = false;
        // 按下鼠标右键
        if (Input.GetMouseButtonDown(2))
            isDown2 = true;
        // 抬起了鼠标右键
        if (Input.GetMouseButtonUp(2))
            isDown2 = false;
        // 缩放 Input.mouseScrollDelta.y
        m_target.localScale += Time.deltaTime * m_target.localScale * Input.mouseScrollDelta.y;
    }
    private void LateUpdate()
    {
        if (isDown1)
        {
            // 计算单位时间内鼠标的偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            Vector3 rot = new Vector3(y, -x, 0);
            float spd = 10; //速度
            m_target.Rotate(spd * rot, Space.World);
        }
        if (isDown2)
        {
            // 计算单位时间内鼠标的偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            float spd = 0.4f;   //速度
            m_target.Translate(spd * new Vector3(x, y), Space.World);
        }
    }
}

5.新建一个Script空物体并将脚本MatrixAction.cs挂载上去,然后将Target拖拽到脚本上

6.为了Hierarchy层次更加清晰,新建几个空物体分隔各个组件 (可忽略)

2016-07-19 00:11:00 weixin_30343157 阅读数 6
  • 老孙的游戏课:第2篇 人机交互

    本课是“老孙游戏课”系列课程的第2篇,该课程重点介绍Unity中的人机交互功能,以游戏实例为背景,深入浅出地讲解键盘操作、鼠标操作、碰撞检测、血条制作等多个游戏中常用的交互变换功能。

    12 人正在学习 去看看 孙博文
using UnityEngine;
using System.Collections;

public class mouse : MonoBehaviour {
    //private Vector3 lasePos;
    private Vector3 offSet;
    private Vector3 ScreenSpace;
    //1.
    void OnMouseDown()
    {
        ScreenSpace = Camera.main.WorldToScreenPoint(transform.position);
        offSet = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));

        //lasePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));
        print("down");
    }

    //2.
    void OnMouseUp()
    {
        print("up");
    }

    //3.
    void OnMouseDrag()
    {
        Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z);
        Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offSet;
        transform.position = CurPosition;
        //Vector3 curPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));
        //Vector3 gapPos = curPos - lasePos;
        //transform.position = transform.position + gapPos;
        //lasePos = curPos;

        print("drag");
    }

    //4.当鼠标移动到内部时
    void OnMouseEnter()
    {
        print("enter");
    }
    //5.当鼠标离开内部时
    void OnMouseExit()
    {
        print("exit");
    }
    //6.当鼠标持续停留在内部时
    void OnMouseOver()
    {
        print("over");
    }
    //7.鼠标停留在内部释放时调用
    void OnMouseUpAsButton()
    {
        print("upAsButton");
    }
}

 

转载于:https://www.cnblogs.com/wrbxdj/p/5683221.html

2013-07-24 12:25:04 a2587539515 阅读数 1510
  • 老孙的游戏课:第2篇 人机交互

    本课是“老孙游戏课”系列课程的第2篇,该课程重点介绍Unity中的人机交互功能,以游戏实例为背景,深入浅出地讲解键盘操作、鼠标操作、碰撞检测、血条制作等多个游戏中常用的交互变换功能。

    12 人正在学习 去看看 孙博文

写在前面:由于本人是初学unity,对其中的部分机制理解还不够深,这篇文章的主要目的是记录我的开发过程,同时向读者们征求更好的解决方法。

 

上一次的鼠标点击移动的文章出了一点bug所以并不完全,这篇文章会补全。

在上一篇:鼠标点击获取地面坐标 (http://blog.csdn.net/a2587539515/article/details/9390795中我们已经输出了point这个坐标,那么鼠标控制移动就很简单了。

首先,使用unity自带的模型(使用模型需要导入资源,在建立项目的时候,根据你制作的游戏需要点击选择就好,模型就是那个修水管那个-_-||,真是的,不说做个帅的)模型中自带了动画并且会自动播放一个跑动的动画,看起来会更生动一点。我们只要模型,删除上面的所有脚本。

接下来设置相机,设置到一个你想要的位置就好,把相机拖到主角身上,让相机跟随主角移动。

按照上一篇的方法,我们会得到一个Point的点,接下来我们只要让主角走到那个点上就好啦。

 

首先让主角面向那个点,我们使用LookAt函数(其实一开始我想加一个转身时间,如果哪位大神有好的算法,请给我留言,不胜感激),这个函数能直接将模型转到一个点的方向。文档如下:

 

Rotates the transform so the forward vector points at /target/'s current position.

旋转物体,这样向前向量指向target的当前位置。简单说,

旋转物体使z轴指向目标物体。

接下了我们只需要让我们的主角向前走就好了。

这个是我的代码c#

mousedo.cs脚本,挂在maincamera上

 

 

using UnityEngine;
using System.Collections;

public class mousedo : MonoBehaviour {
 public GameObject liziparfab;//一个粒子效果,用来标记鼠标点击位置
 public float playerspeed;//设置人物移动速度
 public GameObject player;//我们的主角
 private bool touchbool=false;//用来判断鼠标是否点击
 private Vector3 touchpoint;//得到点击位置(和上一篇的Point相同)
 // Use this for initialization
 void Start () {
 
 }
 
 // Update is called once per frame
 void Update () {
  if(touchbool)//如果点击的话
  { 
   player.transform.LookAt(new Vector3(touchpoint.x,player.transform.position.y,touchpoint.z));//转向点击位置,注:这里的y坐标是人物的高度,防止人物旋转,有兴趣的读者可以试试也用touchpoint.y替换
   if(Mathf.Abs(Vector3.Distance(touchpoint, player.transform.position))>=2.2f)//Mathf.Abs为unity中的取觉得值函数,即当人物与目标点的距离的绝对值小于2.2时为真
   {
    player.transform.Translate(Vector3.forward*playerspeed*Time.deltaTime);//这里让人物向前移动
   }
   else
    touchbool=false;//这里设置为false人物就不会再移动

  }
 if(Input.GetMouseButton(1))
  {//从这里开始和上一篇相同
  Ray ray = camera.ScreenPointToRay(Input.mousePosition);
  RaycastHit hit;
  if (Physics.Raycast(ray, out hit))
   {
    if(hit.transform.name=="Terrain")
    {
     touchbool=true;
    }
    touchpoint=hit.point;
    Instantiate(liziparfab,touchpoint,hit.transform.rotation);

//这里实例化了一个粒子效果
   }
  }
 }
}

在脚本设置好后,人物还是会出现bug(这里就是纠结了我一天的东西-_-||),比如不会下落,但是加入了刚体属性后,人物却又直接穿过地面,恶,到现在我都不明白那个Character Controller到底有什么用,总之我用box Collider替换了它,之后还有一个问题就是人物在走向斜坡时由于box collider的性质太死板,人物会翻滚,额……(其实挺欢乐的……),嘛,总之得改,于是我们在刚体属性中的Constraints限制了物体的Rotation让其不能翻滚,初步的demo总算是成型了,当然目前这个还并不十分完美,应该说是槽点巨多……呵呵,之后如果有更好的方法会来这继续更新……


就此搁笔了,如果文章对您有帮助,我深感荣幸

 

 

unity常用鼠标事件

阅读数 5087

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