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

来源:互联网 发布:java的string不可变 编辑:程序博客网 时间:2024/05/17 01:45

最近在做一个模块,要求使用暴风魔镜SDK通过头部和手柄控制字体拼凑,注意不是笔划的书写哦,以为用头来控制写字实在是太奇怪了......

以“鸟”字为例,其他的字也可以,只需设置好模板上笔划应到的位置,以及按顺序给笔划编号如1,2,3....即可。效果如下,肯定不完美,但还是要记录下来,希望能与大家多交流啊,哈哈哈哈


通过按下魔镜C键来选择下方的笔划,通过头部移动来控制笔划的移动

C键选择时必须按照标准的笔划顺序才能选取



实现思路基本是射线

1.通过射线检测所有物体,当找到tag为Font的物体后,即确定了想要的笔划。

2.通过射线检测所有物体,控制笔划始终与头部发射射线触碰点相一致。

3.以该笔划为发射点向墙体发射射线,碰到需要到达的地方之后,就自动对齐。

需要放置笔划最终想要到达的点,如下



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


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;                  }              }            }      }    }  



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

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;                  }              }            }      }    } 



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


0 0
原创粉丝点击