Unity3d--角色与UI混合显示--实现角色旋转触控

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3d--角色与UI混合显示--实现角色旋转触控相关的知识,希望对你有一定的参考价值。

提示:素材来源网络,侵权必删


前言

角色与UI混合显示:在角色信息界面显示3D角色
实现角色旋转触控:可控制其旋转

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、新建Test场景如下

示例:
准备一个3D人物;
给人物的Layer设置一个层级Player;
在这里插入图片描述

二、在Hierarchy面板下创建一个Camera

示例:
给Camera的Culling Mask设置为前面设置的人物Player层

在这里插入图片描述

三、准备角色信息界面

1.创建如下

在这里插入图片描述

2.创建一个Render Texture,命名为PlayerShow(随意命名)

在这里插入图片描述

3.把PlayerShow托给上面创建的RawImage的Texture

在这里插入图片描述

4.再把PlayerShow托给创建的相机下的Target Texture

在这里插入图片描述

四、代码控制

1.先创建一个PEListener脚本

using System;
using UnityEngine;
using UnityEngine.EventSystems;

namespace HKZ
{
    public class PEListener : MonoBehaviour, IPointerDownHandler, IDragHandler
    {
        public Action<PointerEventData> onClickDown;
        public Action<PointerEventData> onDrag;
        /// <summary>
        /// 拖拽
        /// </summary>
        /// <param name="eventData"></param>
        public void OnDrag(PointerEventData eventData)
        {
            if (onDrag != null)
            {
                onDrag(eventData);
            }
        }
        /// <summary>
        /// 按下
        /// </summary>
        /// <param name="eventData"></param>
        public void OnPointerDown(PointerEventData eventData)
        {
            if (onClickDown != null)
            {
                onClickDown(eventData);
            }
        }
    }
}

2.在创建一个Test脚本

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

namespace HKZ
{
    public class Test : MonoBehaviour
    {
        public RawImage imgChar;
        public Transform player;

        private Vector2 startPos;
        private Transform charCamTrsns;

        private void Awake()
        {
            gameObject.SetActive(false);//隐藏信息面板
            //设置人物信息面板相机
            if (charCamTrsns != null)
            {
                charCamTrsns.gameObject.SetActive(false);
            }
            RegTouchEvts();
        }
        //按下和拖动
        private void RegTouchEvts()
        {
            OnclickDown(imgChar.gameObject, (PointerEventData evt) =>
            {
                startPos = evt.position;//当前点击位置
                SetStartRotate();//记录开始角度
            });
            OnDrag(imgChar.gameObject, (PointerEventData evt) =>
            {
                float rotate = -(evt.position.x - startPos.x) * 0.4f;//每次托拽间隔距离
                SetPlayerRotate(rotate);//旋转
            });
        }

        //关闭页面
        public void ClickCloseBtn()
        {
            gameObject.SetActive(false);
        }
        //打开页面
        public void ClickOpenBtn()
        {
            if (charCamTrsns == null)
            {
                charCamTrsns = GameObject.FindGameObjectWithTag("CharShowCam").transform;
            }

            //设置人物展示相机相对位置
            charCamTrsns.localPosition = player.transform.position +
                player.transform.forward * 3.8f + new Vector3(0, 1.2f, 0);
            charCamTrsns.localEulerAngles = new Vector3(0, 180 +
                player.transform.localEulerAngles.y, 0);
            charCamTrsns.localScale = Vector3.one;
            charCamTrsns.gameObject.SetActive(true);

            gameObject.SetActive(true);
        }
        private float startRotate = 0;
        //记录当前人物位置
        private void SetStartRotate()
        {
            startRotate = player.transform.localEulerAngles.y;
        }
        //拖动后调用使其旋转
        private void SetPlayerRotate(float rotate)
        {
            player.transform.localEulerAngles = new Vector3(0,
                startRotate + rotate, 0);
        }
        #region ClickEvts
        private T GetOrAddComponent<T>(GameObject go)
            where T : Component
        {
            T t = go.GetComponent<T>();
            if (t == null)
            {
                t = go.AddComponent<T>();
            }
            return t;
        }
        private void OnclickDown(GameObject go, Action<PointerEventData> cb)
        {
            PEListener listener = GetOrAddComponent<PEListener>(go);
            listener.onClickDown = cb;
        }
        private void OnDrag(GameObject go, Action<PointerEventData> cb)
        {
            PEListener listener = GetOrAddComponent<PEListener>(go);
            listener.onDrag = cb;
        }
        #endregion
    }
}

3.信息设置

1.设置相机标签和打开关闭按钮事件

在这里插入图片描述

2.

在这里插入图片描述

五、效果

在这里插入图片描述

总结

在这里插入图片描述

以上是关于Unity3d--角色与UI混合显示--实现角色旋转触控的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D实战RPG黑暗之光Scene2:创建角色选择场景

摄像机与主角之间遮挡显示处理(Unity3D开发之二十八)

摄像机与主角之间遮挡显示处理(Unity3D开发之二十八)

Unity3D角色控制器(CharacterController)

Unity3D中怎么实现摄像机环绕角色和跟随角色的切换?

Unity入门计划Unity2D动画-脚本与混合树实现玩家角色动画过渡