赞
踩
效果图
上面做了个横梁,上面一块Cube作为钩子,下面的Cube作为要吊起的重物,中间的绳子用Capsule
思路:鼠标左右滑动实现钩子的左右滑动,松开鼠标---钩子下滑,当钩子等撞到重物的时候停止下降 并带着重物一同上升,回到一定高度后,开始水平回到初始位置,并判断(是否勾住重物)如果勾住重物了 ,在原点位置,下降 然后放下重物,如果没勾住重物 则再远点不动,等待第二次操作。
在每次操作的过程中,不能进行第二次操作
结构:
上代码:
QizhongjiCS.cs控制钩子的滑动、钩子的下降、上升
- using UnityEngine;
- using System.Collections;
-
- public class QizhongjiCS : MonoBehaviour {
- private float dianX = 0;
- public GameObject hook;
- private float yuandianX;
- private Vector3 hookV;
- private int flag=0;
- private delegate void HookMove();
- private HookMove _hookMove=null;
- private int speed=3;
-
- public HookZhongWu hzw;
- private int zwFlag=0;
- private GameObject zhongwu; //抓住的重物;
-
- public GameObject shengzi;
- public GameObject heng;
- // Use this for initialization
- void Start () {
- hookV = hook.transform.localPosition;
- yuandianX = hookV.x;
- }
-
- // Update is called once per frame
- void Update () {
- if (flag == 0) {
- if (Input.GetMouseButtonDown(0))
- {
- dianX = Input.mousePosition.x;
- }
- else if (Input.GetMouseButton(0))
- {
- float dx = Input.mousePosition.x - dianX;
- if (Mathf.Abs(dx) > 0.1f)
- {
-
- hookV.x = yuandianX + dx / 32;
- if (hookV.x > -6 && hookV.x < 6)
- {
- hook.transform.localPosition = hookV;
- }
-
- }
-
-
- }
- else if (Input.GetMouseButtonUp(0))
- {
- //yuandianX = hookV.x;
- flag = 1;
- _hookMove = hookDown;
- StartCoroutine(downZhua());
- }
- }
- }
- IEnumerator downZhua() {
- yield return new WaitForSeconds(0.01f);
- //1、向下移动, +speed
- //2、判断移动的位置 如果大于某个位置 ,返回 speed为负
- if (_hookMove != null)
- {
- _hookMove();
- yield return StartCoroutine(downZhua());
- }
- else {
- yield return null;
- }
-
-
-
- //3、判断移动回到原点 整个钩子向原始位置水平运动
-
- //4、判断钩子回到原点 停止协程 flag=0
- yield return StartCoroutine(downZhua());
- }
- void hookDown() {
- hook.transform.Translate(Vector3.down * Time.deltaTime * speed);
- changeShengZi();
- if (hook.transform.localPosition.y < -2) {
- if (zwFlag == 1) {
- zhongwu.transform.parent = null;
- zhongwu = null;
- zwFlag = 0;
- }
- _hookMove = hookUp;
- }
- }
- void hookUp()
- {
- hook.transform.Translate(Vector3.up * Time.deltaTime * speed);
- changeShengZi();
- if (hook.transform.localPosition.y >3.2)
- {
-
- _hookMove = HMove;
-
-
- }
- }
- void HMove()
- {
-
- hook.transform.Translate(Vector3.left * Time.deltaTime * speed);
-
- if (hook.transform.localPosition.x <=-4.5)
- {
- if (zwFlag == 0)
- {
- flag = 0;
- _hookMove = null;
- }
- else {
- _hookMove = hookDown;
- }
-
- }
- }
- public void zhuaZhongWu(GameObject zhongwu) {
- _hookMove = hookUp;
- zwFlag = 1;
- this.zhongwu = zhongwu;
- }
- void changeShengZi() {
- Vector3 hookPosition = hook.transform.position;
- Vector3 hengliangP = heng.transform.position;
- float dy = hookPosition.y - hengliangP.y;
- Vector3 shengziP = shengzi.transform.position;
- shengziP.y = hengliangP.y + dy / 2;
- shengzi.transform.position = shengziP;
-
-
- //改变 绳子长度
- Vector3 shengziSclae = shengzi.transform.localScale;
- shengziSclae.y = dy/2;
- shengzi.transform.localScale = shengziSclae;
- }
- }
----------------------------------------------
HookZhongWu.cs用来判断 钩子是否和重物碰撞
碰上的时候 将重物设置成钩子的子对象 就可以实现带着往上升的效果了
- sing UnityEngine;
- using System.Collections;
-
- public class HookZhongWu : MonoBehaviour {
- public QizhongjiCS qzj;
- void OnTriggerEnter(Collider collision)
- {//当碰撞时
- print("OnTriggertEnter+" + collision.gameObject.name);
- if (collision.gameObject.name == "zhongwu") {
- collision.gameObject.transform.parent = this.gameObject.transform;
- Vector3 v = collision.gameObject.transform.localPosition;
- v.y = -1.2f;
- collision.gameObject.transform.localPosition = v;
- qzj.zhuaZhongWu(collision.gameObject);
- }
- }
- }
创建工程后添加一个Cube物体,为其添加一个脚本。
- using UnityEngine;
- using System.Collections;
- public class Cube : MonoBehaviour {
-
- private float timer = 0f;
- private int h = 0;
- private int m = 0;
- private int s = 0;
- private string timeStr = string.Empty;
-
- // Update is called once per frame
- void Update () {
- timer += Time.deltaTime;
- if (timer >= 1f) {
- s++;
- timer = 0;
- }
- if (s >= 60) {
- m++;
- s = 0;
- }
- if (m >= 60) {
- h++;
- m = 0;
- }
- if (h >= 99) {
- h = 0;
- }
- }
-
- void OnGUI(){
- timeStr = string.Format ("{0:D2}:{1:D2}:{2:D2}", h, m, s);
- GUI.Label (new Rect (10, 10, 100, 200), timeStr);
- }
- }
在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。
1.鼠标滚轮实现缩放:
将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:
- void Update () {
- //鼠标滚轮的效果
- //Camera.main.fieldOfView 摄像机的视野
- //Camera.main.orthographicSize 摄像机的正交投影
- //Zoom out
- if (Input.GetAxis("Mouse ScrollWheel") < 0)
- {
- if (Camera.main.fieldOfView <= 100)
- Camera.main.fieldOfView += 2;
- if (Camera.main.orthographicSize <= 20)
- Camera.main.orthographicSize += 0.5F;
- }
- //Zoom in
- if (Input.GetAxis("Mouse ScrollWheel") > 0)
- {
- if (Camera.main.fieldOfView > 2)
- Camera.main.fieldOfView -= 2;
- if (Camera.main.orthographicSize >= 1)
- Camera.main.orthographicSize -= 0.5F;
- }
- }
2.鼠标实现在场景中拖动物体:
解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理
主要代码如下:
- void Start ()
- {
- StartCoroutine(OnMouseDown());
- }
-
- IEnumerator OnMouseDown()
- {
- //将物体由世界坐标系转换为屏幕坐标系
- Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标
- //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系
- // // 2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离
- //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离
- Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
- while (Input.GetMouseButton(0))
- {
- //得到现在鼠标的2维坐标系位置
- Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
- //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量
- Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
- //curPosition就是物体应该的移动向量赋给transform的position属性
- transform.position = curPosition;
- yield return new WaitForFixedUpdate(); //这个很重要,循环执行
- }
- }
- UnityEngine;
- using System.Collections;
- public class DragRotateWithSlider : MonoBehaviour {
-
- private bool onDrag = false; //是否被拖拽
- public float speed = 5f; //旋转速度
- private float tempSpeed; //阻尼速度
- private float axisX; //鼠标沿水平方向移动的增量
- private float axisY; //鼠标沿垂直方向移动的增量
- private float cXY; //鼠标移动的距离
-
- //接收鼠标按下的事件
- void OnMouseDown ()
- {
- axisX = 0f; //为移动的增量赋初值
- axisY = 0f;
- }
-
- //鼠标拖拽时的操作
- void OnMouseDrag()
- {
- onDrag = true; //被拖拽
- axisX = Input.GetAxis("Mouse Y"); //获得鼠标增量
- axisY = -Input.GetAxis("Mouse X");
- cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度
- if (cXY == 0f)
- {
- cXY = 1f;
- }
- }
-
- //Count TempSpeed
- float Rigid() //计算阻尼速度
- {
- if (onDrag)
- {
- tempSpeed = speed;
- }
- else
- {
- if (tempSpeed > 0)
- {
- tempSpeed -= speed * 2 * Time.deltaTime / cXY;//通过除以鼠标移动长度实现拖拽越长速度减缓越慢
- }
- else
- {
- tempSpeed = 0;
- }
- }
- return tempSpeed; //返回阻尼的值
- }
-
- void Update()
- {
- gameObject.transform.Rotate(new Vector3(axisX, axisY, 0) * Rigid(), Space.World);
- if (!Input.GetMouseButton(0))
- {
- onDrag = false;
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。