unity3D中点击按钮位移镜头到指定物体和鼠标点击物体位移镜头方法
unity3D中点击按钮位移镜头到指定物体和鼠标点击物体位移镜头方法需求1、点击目标(例cube)镜头位移到距离目标的指定位置2、点击按钮镜头位移到距离目标的指定位置前期设置1、新建一个场景并保存2、新建三个cube,分别改变位置(0,0,0),(5,0,0),(10,0,0)3、新建三个材质,分别加到cube上,便于位移效果实现后区分cube4、新建三个按钮,分别命名为cube1,cube2,c
unity3D中点击按钮位移镜头到指定物体和鼠标点击物体位移镜头方法
需求
1、点击目标(例cube)镜头位移到距离目标的指定位置
2、点击按钮镜头位移到距离目标的指定位置
前期设置
1、新建一个场景并保存
2、新建三个cube,分别改变位置(0,0,0),(5,0,0),(10,0,0)
3、新建三个材质,分别加到cube上,便于位移效果实现后区分cube
4、新建三个按钮,分别命名为cube1,cube2,cube3,并修改按钮位置和文字
5、将摄像机位置移动到能看见三个cube的位置,我的位置是(5,0,-10)
6、界面部分就结束了
代码编写
1、新建脚本,命名自己取或者按我的是 MovingFunction
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovingFunction : MonoBehaviour
{
//相机
public Camera cam;
//相机移动到的点
Vector3 targetPos;
//速度
float speed = 1f;
//步
float step;
//是否点击按钮1
bool isB1 = false;
//是否点击按钮2
bool isB2 = false;
//是否点击按钮3
bool isB3 = false;
//是否鼠标点击物体
bool isMouseClick = false;
//镜头移动状态(若当前移动状态为真,为正在移动,则点击其他物体或点击按钮不产生效果)
bool Moving = false;
//开始设置步长
void Start()
{
step = (speed * Time.deltaTime);
}
//每帧执行
void Update()
{
//发出射线,当点击到物体且镜头非移动状态(Moving==false)时
//得到该物体坐标,摄像机移动到该物体z轴-10的位置
//运行射线方法移动函数,位移状态改变为真
#region 射线
if (Input.GetMouseButtonDown(0) && Moving == false)
// if(Input.GetKey(KeyCode.Mouse0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
//得到鼠标左键点击的物体gameObj
GameObject gameObj = hitInfo.collider.gameObject;
//输出物体的位置
Debug.Log(gameObj.transform.position);
//输出物体名称
Debug.Log(gameObj.name);
//目标点位置
targetPos = gameObj.transform.position + new Vector3(0, 0, -10);
//镜头状态改变为移动
isMouseClick = true;
Moving = true;
}
}
#endregion
#region 镜头位移到指定位置
if (isMouseClick) {
moving_check(targetPos);
}
#endregion
//每增加一个物体,增加一个按钮时,内部的if必须增加,且坐标需
//要根据物体的位置而写死在移动方法的传参里面,非常不方便
#region 镜头位移到固定位置
if (isB1 || isB2 || isB3) {
if (isB1)
{
moving_check(new Vector3(0, 0, -10), ref isB1);
}
if (isB2)
{
moving_check(new Vector3(5, 0, -10), ref isB2);
}
if (isB3)
{
moving_check(new Vector3(10, 0, -10), ref isB3);
}
}
#endregion
}
#region 射线方法到达 到达后关闭移动
void moving_check(Vector3 v) {
//摄像机位置移动到v位置
cam.transform.localPosition = Vector3.MoveTowards(cam.transform.localPosition, v, step);
//当到达目的地,关闭移动状态
if (cam.transform.localPosition == v)
{
isMouseClick = false;
Moving = false;
}
}
#endregion
#region 按钮方法到达 到达后取消移动
void moving_check(Vector3 v, ref bool b)
{ //同上
cam.transform.localPosition = Vector3.MoveTowards(cam.transform.localPosition, v, step);
if (cam.transform.localPosition == v)
{
b = false;
Moving = false;
}
}
#endregion
#region 按钮连接的方法,改变指定位移的状态,输出按钮名称
public void clickButton()
{ //当移动状态为假时执行
if (Moving==false) {
var button = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject;
//print(button.name);
switch (button.name)
{
case "cube1": isB1 = true;Moving = true; break;
case "cube2": isB2 = true;Moving = true; break;
case "cube3": isB3 = true;Moving = true; break;
}
}
}
#endregion
}
2、在场景中新建一个空物体用来挂载脚本(这是好习惯,脚本千万别乱挂),将主摄像机拖拽到脚本的cam里
3、运行,应该没有问题,
结语
1、虽然实现了镜头追踪物体的效果,但按钮点击部分源码位置数据都是写死的,所以很麻烦,实现的很笨。
2、没有镜头旋转的内容,仅仅是将镜头移动到固定点,后续将继续研究实现。
3、代码可读性差,虽然在源码中添加了大量注释,但感觉代码写的很乱,虽然已经修改很多次,但是因为没有重构代码的经验,感觉代码看起来思路不清晰。
每添加一个物体一个按钮就要修改源码,实在是一种很笨的实现方法,但作者目前C#和Unity3D的学习处于起步阶段,其中的不足之处还请大家多多指教。如果你和我一样,希望这篇文章能帮你解决一些问题。
更多推荐
所有评论(0)