Unity 制作虚拟遥感操控人物旋转移动实现+案例

效果图

在这里插入图片描述
遥感,分圆内圆外两种情况,在圆内遥感的位置等于鼠标位置,在圆外,遥感位置是在大圆边缘
(遥感位置=鼠标位置圆心位置的单位向量*相差半径+遥感初始位置)在这里插入图片描述

角色旋转原理,人物z轴对用遥感y轴,形成一种映射。人物提供一个自身旋转转的方法,遥感可以计算出角度,得出角度之后把值付给人物,使人物旋转
在这里插入图片描述

代码我大部分都标记了,在这就不多解释了,自行看代码

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

public class EEasyTouch : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
    public void OnBeginDrag(PointerEventData eventData)
    {
        //开始拖拽时显示
        group.alpha = 1;
        //结合我上一篇FSM框架的应用  很简单
        StoneCtrl.Instance.ChangeStoneAnimation(StoneCtrl.StoneStates.StoneWalk);
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector2 deltaPos = eventData.position - orignPos;

        float deltaDistance = Vector3.Distance(eventData.position, orignPos);
        //遥感在大圆内
        if (deltaDistance <= radius)
        {
            //圆内 遥感位置=鼠标位置
            transform.position = eventData.position;
        }
        //在圆外
        else
        {
            //圆外 遥感位置在大圆边上
            //delta的单位向量*半径+圆心初始位置得出在大圆边境上的位置
            transform.position = deltaPos.normalized * radius + orignPos;
        }
        //遥感xy轴对应 stone的xz 形成一种映射 使stone旋转
        //求出弧度
        //为什么要用tan-----去看三角函数曲线,tan对应的是一个值,sincos可能对应多个值
        float tmpAngle = Mathf.Atan2(deltaPos.y, deltaPos.x);

        tmpAngle = Mathf.Rad2Deg * tmpAngle;
        //Debug.Log("tmpAngle====" + tmpAngle);
        
        Vector3 tmpEuler = transform.localEulerAngles;

        tmpEuler.z = tmpAngle;
        //改变z值,使其旋转
        transform.localEulerAngles = tmpEuler;
        //外界提供Stone旋转方法
        StoneCtrl.Instance.RotatePlayer(90 - tmpAngle);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        //结束拖拽隐藏遥感
        group.alpha = 0;
        //回归原位
        transform.position = orignPos;
        StoneCtrl.Instance.ChangeStoneAnimation(StoneCtrl.StoneStates.StoneIdle);
    }
    //大小
    float smallSize;
    float bigSize;
    //活动半径
    float radius;
    //遥感初始位置
    Vector2 orignPos;
    CanvasGroup group;
    private void Start()
    {
        group = GetComponent<CanvasGroup>();
        //没有点击时 把遥感隐藏
        group.alpha = 0;

        smallSize = ((RectTransform)transform).sizeDelta.x * 0.5f;
        bigSize = ((RectTransform)transform.parent).sizeDelta.x * 0.5f;
  
        radius = bigSize - smallSize;
       //记录初始位置
        orignPos =transform.position;
    }
   
}

StoneCtrl提供一个旋转自身方法

 public void RotatePlayer(float angle)
    {
        Vector3 tmpAngle = transform.localEulerAngles;

        tmpAngle.y = angle;

        transform.localEulerAngles = tmpAngle;
    }
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值