Unity下使用暴风魔镜SDK通过头部和手柄控制字体拼凑(二)

本博客介绍了如何在Unity环境中使用暴风魔镜SDK,通过头部和手柄控制字体的各个笔划进行拼凑。首先,按照笔划顺序对物体命名,并为每个笔划实体添加碰撞体。originalStrokePositionParent对象用于记录笔划原始位置,而position对象则标记笔划在墙上的目标位置,两者都带有相应的tag。接着,详细讲述了选择笔划和控制其移动的代码实现过程。
摘要由CSDN通过智能技术生成

工程如下图,按照笔划顺序给笔划命名


stroke下的物体是笔划实体,tag是Font,加碰撞体

originalStrokePositionParent下的是笔划实体原本待在的地方,tagboardStrokePosition

position是墙上希望笔划应该待在的地方,tag是wallStrokePosition,加碰撞体

代码如下:

选择笔划及控制移动

using UnityEngine;
using System.Collections;
namespace MojingSample.CrossPlatformInput.PlatformSpecific
{

    public class FontMove : MonoBehaviour
    {

        public static FontMove _instance;

        private GameObject lacuchPosition;//射线发射位置
        public GameObject targetMoveObject = null;//被拾起的笔画

        public LayerMask moveLayer;//移动层
        public LayerMask wallLayer;//墙体层

        public bool isMove = false;//是否可以移动
        public bool isFind = true;//是否可以寻找

        private Vector3 lastPosition;
        private int strokeNumber=1;//记录笔画顺序

        void Awake()
        {
            _instance = this;
        }

        void Start()
        {
            lacuchPosition = GameObject.FindGameObjectWithTag("MainCamera");
        }

        // Update is called once per frame
        void Update()
        {
            FindTarget();
            if (isMove == true)
                TargetMove();
        }

        void FindTarget()
        {//寻找需要选择的笔画
            if (isFind == true)
                if (CrossPlatformInputManager.GetButtonDown("C") || Input.GetKeyDown(KeyCode.J))
                {

                    RaycastHit info;
                    bool hit = Physics.Raycast(lacuchPosition.transform.position, lacuchPosition.transform.forward, out info, 100);
                    if (hit)
                    {
                        if (info.transform.tag == "Font")
                        {
                            if (info.transform.name == strokeNumber.ToString())
                            {//如果满足要求的笔划顺序
                                targetMoveObject = info.transform.gameObject;
                                lastPosition = targetMoveObject.transform.position;
                                isMove = true;
                                isFind = false;
                                targetMoveObject.GetComponent<BoxCollider>().enabled = false;
                                strokeNumber++;
                            }
                        }
                    }
                }
        }

        void TargetMove()
        {//移动笔画
            if (targetMoveObject != null)
            {
                RaycastHit info;
                bool hit = Physics.Raycast(lacuchPosition.transform.position, lacuchPosition.transform.forward, out info, 100);
                if (hit)
                {
                    if (info.transform.tag == "Wall")
                    {
                        Vector3 pos = info.point;
                        pos -= new Vector3(0.1f, 0, 0);
                        targetMoveObject.transform.position = pos;
                    }
                }
            }
        }
    }
}
控制笔划匹配

using UnityEngine;
using System.Collections;
namespace MojingSample.CrossPlatformInput.PlatformSpecific
{
    public class FontAlign : MonoBehaviour
    {
        private GameObject[] wallStrokePosition;//墙上应该被放置的笔画的位置
        private GameObject lacuchPosition;//笔画向墙发射射线的位置

        private GameObject targetStroke = null;//墙上被选中的笔画

        // Use this for initialization
        void Start()
        {
            wallStrokePosition = GameObject.FindGameObjectsWithTag("wallStrokePosition");
        }

        // Update is called once per frame
        void Update()
        {
            if (FontMove._instance.targetMoveObject != null)
            {
                lacuchPosition = FontMove._instance.targetMoveObject;
            }
            FindPosition();
        }
        void FindPosition()
        {
            if (lacuchPosition != null)
            {
                foreach (GameObject go in wallStrokePosition)
                {
                    if (go.name == lacuchPosition.name)
                    {
                        targetStroke = go;
                    }
                }
                if (FontMove._instance.targetMoveObject != null)
                    if (Vector3.Distance(lacuchPosition.transform.position, targetStroke.transform.position) <= 0.5f)
                {
                    FontMove._instance.isMove = false;
                    FontMove._instance.isFind = true;
                    FontMove._instance.targetMoveObject.transform.position = targetStroke.transform.position;
                    FontMove._instance.targetMoveObject = null;
                }
            }

        }
    }

}

有不足的地方或者更好地解决办法希望大家能指出哦

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值