您的位置:首页 > 移动开发 > Unity3D

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

2016-12-29 14:14 519 查看
最近在做一个模块,要求使用暴风魔镜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;
FontM
da66
ove._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;
}
}

}
}

}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: