unity中UGUI图片箭头指向鼠标位置
2017-08-29 23:02
344 查看
初学unity,公司项目中遇到的一个简单小功能,重新回顾了初高中的额数学知识,希望对同样初学者有用
,demo就不上传了,工程中只用到一个图片(image),代码拖进去就能用了。
效果如图
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class PlayerControl : MonoBehaviour {
public Image _jianTou;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
WorldToScreenPos();
}
void WorldToScreenPos()
{
Vector2 screenPos = Camera.main.WorldToScreenPoint(transform.position);
Debug.Log(transform.position);
Debug.Log(screenPos);
//Debug.Log("箭头屏幕坐标:"+_jianTou.transform.position);
// Debug.Log("鼠标屏幕坐标:" + Input.mousePosition);
_jianTou.transform.LookAt(Input.mousePosition);
Vector2 jianTouPos = Camera.main.ViewportToScreenPoint(_jianTou.transform.position);
Vector2 mousePos = Camera.main.ViewportToScreenPoint(Input.mousePosition);
float xiangJianY = mousePos.y - jianTouPos.y;
float xiangJianX = mousePos.x - jianTouPos.x;
float jianTouRotationZ = 0f;
if (xiangJianX >= 0)
{
if (xiangJianX == 0)
{
if (xiangJianY > 0)
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 90f);
}
else if (xiangJianY < 0)
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f - 90f);
}
else
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 90f);
}
}
else
{
if (xiangJianY > 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY),Mathf.Abs(xiangJianX))*180f/Mathf.PI;
Debug.Log("角度值:" + jianTouRotationZ);
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + jianTouRotationZ);
}
else if (xiangJianY < 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY), Mathf.Abs(xiangJianX)) * 180f / Mathf.PI;
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f - jianTouRotationZ);
}
else
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f);
}
}
}
else
{
if (xiangJianY > 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY), Mathf.Abs(xiangJianX)) * 180f / Mathf.PI;
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f - jianTouRotationZ);
}
else if (xiangJianY < 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY), Mathf.Abs(xiangJianX)) * 180f / Mathf.PI;
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f + jianTouRotationZ);
}
else
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f+180f);
}
}
}
}
,demo就不上传了,工程中只用到一个图片(image),代码拖进去就能用了。
效果如图
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class PlayerControl : MonoBehaviour {
public Image _jianTou;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
WorldToScreenPos();
}
void WorldToScreenPos()
{
Vector2 screenPos = Camera.main.WorldToScreenPoint(transform.position);
Debug.Log(transform.position);
Debug.Log(screenPos);
//Debug.Log("箭头屏幕坐标:"+_jianTou.transform.position);
// Debug.Log("鼠标屏幕坐标:" + Input.mousePosition);
_jianTou.transform.LookAt(Input.mousePosition);
Vector2 jianTouPos = Camera.main.ViewportToScreenPoint(_jianTou.transform.position);
Vector2 mousePos = Camera.main.ViewportToScreenPoint(Input.mousePosition);
float xiangJianY = mousePos.y - jianTouPos.y;
float xiangJianX = mousePos.x - jianTouPos.x;
float jianTouRotationZ = 0f;
if (xiangJianX >= 0)
{
if (xiangJianX == 0)
{
if (xiangJianY > 0)
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 90f);
}
else if (xiangJianY < 0)
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f - 90f);
}
else
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 90f);
}
}
else
{
if (xiangJianY > 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY),Mathf.Abs(xiangJianX))*180f/Mathf.PI;
Debug.Log("角度值:" + jianTouRotationZ);
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + jianTouRotationZ);
}
else if (xiangJianY < 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY), Mathf.Abs(xiangJianX)) * 180f / Mathf.PI;
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f - jianTouRotationZ);
}
else
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f);
}
}
}
else
{
if (xiangJianY > 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY), Mathf.Abs(xiangJianX)) * 180f / Mathf.PI;
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f - jianTouRotationZ);
}
else if (xiangJianY < 0)
{
jianTouRotationZ = Mathf.Atan2(Mathf.Abs(xiangJianY), Mathf.Abs(xiangJianX)) * 180f / Mathf.PI;
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f + jianTouRotationZ);
}
else
{
_jianTou.transform.rotation = Quaternion.Euler(0f, 0f, 360f+180f);
}
}
}
}
相关文章推荐
- Unity中UGUI中获取鼠标点击位置以及UI物体的屏幕坐标
- unity获取ugui上鼠标位置
- cocos2d 角度转换 (精灵图片如何指向点击位置)
- Unity鼠标悬停实现图片的浮动效果
- js图片轮播,可控制中间位置选中状态和左右箭头控制
- Unity UGUI 图片模糊
- 【Unity】UGUI如何判断鼠标或者手指是否点击到UI上
- [Unity]箭头2D图片精灵的Pivot锚点怎么设置
- 天猫商城多幅图片并排展示广告效果,鼠标指向高亮其它阴影
- JS 实现鼠标指向图片时图片放大的效果
- unity 在UI中 点击画布 返回鼠标所在画布的位置
- flex实现图片根据鼠标的滚动放大或缩小(以鼠标的的位置 为中心放大缩小)
- UGUI中点击鼠标绘制图片
- c# WPF 中图片缩放功能,鼠标拖动位置
- UGUI--------UI以及3D物体显示在鼠标点击位置
- CSS利用a:hover和background-position实现鼠标指向更改图片
- Javascript实现图片位置控制(鼠标拖拽 + 键盘方向键移动)源码分享
- [转]UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
- Unity物体跟随鼠标点的位置自动寻路
- unity之鼠标的隐藏和更换图片