最后效果如下:
准备好两个脚本:
1. eyeselect4.cs
2. SmoothFollow.cs (注意这个脚本中最后一行中的约束代码要注释掉)
紧接着就是导入character包
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public enum PointModel{
OnUGUI,
defaul
}
public class eyeSelect4 : MonoBehaviour
{
private GameObject leftEyeTarget, rightEyeTarget, player;
float tempAngleX;
float tempAngleZ;
//public GameObject huangDian; //小黄点
public GameObject LoadImage; //转圈的粒子
public float coldTime = 3; //此变量控制转一圈需要的时间
private float timer = 0;
void Start()
{
player = GameObject.Find("player").gameObject;
tempAngleX = transform.rotation.x;
tempAngleZ = transform.rotation.z;
}
public float smooth = 0.1F;
private float yVelocity = 0.0F;
GameObject cache;
private bool mm = true;
void Update()
{
player.transform.position = new Vector3(player.transform.position.x,-1.4f, player.transform.position.z);
float floatyAngle = Mathf.SmoothDampAngle(player.transform.eulerAngles.y, transform.eulerAngles.y, ref yVelocity, smooth);
Vector3 fwd = transform.TransformDirection(Vector3.forward);
RaycastHit hit;
if (Physics.Raycast(transform.position, fwd, out hit, Mathf.Infinity))
{
if (hit.collider.gameObject)
{
float dist = hit.distance + gameObject.GetComponent<Camera>().nearClipPlane;
// huangDian.transform.localScale = new Vector3(0.01f * dist*2, 0.01f * dist*2, 0.01f * dist*2);
//huangDian.transform.position = gameObject.transform.position + gameObject.transform.forward * 1.5f;
GameObject gameObj = hit.collider.gameObject;
// print(gameObj.name);
if (gameObj == null)
return;
player.transform.rotation = Quaternion.Euler(transform.rotation.x, floatyAngle, transform.rotation.z);
print(gameObj.name);
if (gameObj.name.Equals("MoveObj"))
{
print("xu hai tao cheng yu jie");
player.transform.Translate(Vector3.forward * Time.deltaTime * 0.5f);
}
if (LayerMask.LayerToName(gameObj.layer).Equals("haitao"))//如果目前正在凝视指定目标
{
if (mm)
{
mm = false;
cache = Instantiate(LoadImage);
}
if (cache != null)
{
cache.transform.position = hit.point; //将转圈图像立即切到目标位置
diaoYong(gameObj);//开始转圈
}
// cache.transform.rotation = gameObj.transform.rotation;
}
else if (LayerMask.LayerToName(gameObj.layer).Equals("quick"))
{
LoadImage.transform.position = hit.point; //将转圈图像立即切到目标位置
// LoadImage.transform.rotation = gameObj.transform.rotation;
gameObj.GetComponent<Button>().onClick.Invoke(); //触发凝视目标所绑定的方法
}
else
{
//目标凝视取消时,恢复初始值
timer = 0;
if (LoadImage != null)
{
Destroy(cache);
}
mm = true;
}
}
}
else
{
//目标凝视取消时,恢复初始值
timer = 0;
if (LoadImage != null)
{
Destroy(cache);
}
mm = true;
}
}
void diaoYong(GameObject gameObj)
{
timer += Time.deltaTime;
print(timer);
if (timer >= coldTime) //转圈刚转完就执行
{
timer = 0;
Destroy(cache);
print(gameObj);
gameObj.GetComponent<Button>().onClick.Invoke(); //触发凝视目标所绑定的方法
}
}
}
重要一点的是删掉预设体中的Head层级,然后将CardboardHead组件添加到MainCamera上
Cardboard相机位置在高度上方向上的值是保持不变的
角色控制器的位置决定Cardboard的位置
CardBoard的旋转决定角色控制器的旋转
Cardboard相机的凝视触发角色控制器的移动
角色碰撞体(即player)的位置的竖直方向的值要靠eyeselect这个脚本中如下截图中代码来控制
FR:海涛高软(QQ群:386476712)