unity 实现摄像机绕某点旋转一周

在Update函数中执行:

if (turnAround)
  {
    playerCamera.RotateAround(transform.localPosition, transform.up, Time.deltaTime * rotateSpeed);
    degree += Time.deltaTime * rotateSpeed;
    if (degree >= 360)
    {
      turnAround = false;
      degree = 0;
     }
   }

补充:unity 摄像机围绕某个物体进行旋转放大缩小

脚本通过以一个物体为中心点

来控制摄像机围绕物体旋转缩放 ,脚本挂在摄像机上即可,target是需要观看的物体

public Transform Camera2;
public GameObject target;
private float dis;
public float xSpeed = 200, ySpeed = 200, mSpeed = 10;                   //移动速度
public float yMinLimit = -50, yMaxLimit = 50;                           //摄像机的Y轴移动最小最大限制
public float distance = 7, minDistance = 2, maxDistance = 30;           //摄像机与目标物体的距离
public bool needDamping = true;                                         //阻尼默认开启
float damping = 5.0f;                                                   //默认阻尼为5.0F
public float x = 0.0f;                                                  //X轴
public float y = 0.0f;                                                  //Y轴
// Use this for initialization
void Start() {
    instance = this;
    Camr = Camera2Rotation.Close;
    Vector3 angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;
}
private void Update()
{
}
void LateUpdate()
{
            //使用按下鼠标左键移动物体
            if (Input.GetMouseButton(1))
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                y = ClampAngle(y, yMinLimit, yMaxLimit);
            }
            distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
            distance = Mathf.Clamp(distance, minDistance, maxDistance);
            Quaternion rotation = Quaternion.Euler(y, x, 0.0f);
            Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotation * disVector + target.transform.position;
            //adjust the camera
            if (needDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
            }
            else
            {
                transform.rotation = rotation;
                transform.position = position;
            }
}
/// <summary>
/// 旋转角度的控制
/// </summary>
/// <param name="angle">旋转的角度</param>
/// <param name="min">最小角度</param>
/// <param name="max">最大角度</param>
/// <returns></returns>
static float ClampAngle(float angle, float min, float max)
{
    if (angle < -360)
        angle += 360;
    if (angle > 360)
        angle -= 360;
    return Mathf.Clamp(angle, min, max);
}
void MoveCameraToTarget()
{
    if (target != null)
    {
        Camera2.LookAt(target.transform);
        Camera2.position = Vector3.MoveTowards(Camera2.position, target.transform.position, 5 * Time.deltaTime);
        dis = Vector3.Distance(Camera2.transform.position, target.transform.position);
        if (dis < 1.5f)
        {
            Camr = Camera2Rotation.Open;
            CancelInvoke();
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity之绕轴进行旋转的操作

    先上一张效果图 using UnityEngine; using System.Collections; public class TestRotateRound : MonoBehaviour { public GameObject Sphere; private float curtTime = 0.0f; void Update() { //使用C#封装好的代码RotateAround gameObject.transform.RotateAround(Sphere.transform.p

  • 解决unity rotate旋转物体 限制物体旋转角度的大坑

    今天可是遇到一个很简单的需求,但是却让我蛋疼了半天. 滑动屏幕控制物体旋转,但是旋转的角度要在-60到60之间. 乍一听这简直是小儿科啊. 判断一下角度不就行了.相比这四元数,欧拉角虽然有时会出现万向锁,但是简洁明了啊. 这不,我就中了一个简洁明了的大坑. 图中,如果你以为transform.eulerAngles =(-1,0,90) 那就大错特错了. 因为对于旋转来说.360度是一个循环.-1° 也可以算是就是359° 而且unity就是这样认为的.面板上虽然显示的是-1.但是他运行时是35

  • Unity3d 使用Gizmos画一个圆圈

    Gizmos是场景视图里的一个可视化调试工具. 在做项目过程中.我们常常会用到它,比如:绘制一条射线等. Unity3D 4.2版本号截至.眼下仅仅提供了绘制射线,线段,网格球体,实体球体,网格立方体,实体立方体,图标.GUI纹理,以及摄像机线框. 假设须要绘制一个圆环还须要自己写代码 using UnityEngine; using System; public class HeGizmosCircle : MonoBehaviour { public Transform m_Transfor

  • Unity 通过LineRenderer绘制两点之间的直线操作

    我就废话不多说了,大家还是直接看代码吧~ private LineRenderer line; //画线 line = this.gameObject.AddComponent<LineRenderer>(); //只有设置了材质 setColor才有作用 line.material = new Material(Shader.Find("Particles/Additive")); line.SetVertexCount(2);//设置两点 line.SetColors(

  • Unity 实现给物体替换材质球

    下面先看一下效果图 using UnityEngine; using System.Collections; public class textMesh : MonoBehaviour { public Material meshRender = null; public Renderer rend; public Texture texture; void Start () { //把名字为bangongshi4 的材质球放到Resources文件夹下 meshRender = Resourc

  • unity AudioSource播放完声音后要执行的函数或条件操作

    将脚本挂在要判断声音是否播放完毕的物体上 using System.Collections; using UnityEngine; using UnityEngine.Events; [RequireComponent(typeof(AudioSource))] public class AudioManager : MonoBehaviour { public static AudioManager instence = null; private AudioSource _audio; vo

  • Unity 如何获取鼠标停留位置下的物体

    根据UGUI的射线检测机制获取当前鼠标下的UI: /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { PointerEventData pointerEventData

  • unity 如何使用LineRenderer 动态划线

    我就废话不多说了,大家还是直接看代码吧~ private LineRenderer line1; //画线 line1 = this.gameObject.AddComponent<LineRenderer>(); //只有设置了材质 setColor才有作用 line1.material = new Material(Shader.Find("Particles/Additive")); line1.SetVertexCount(2);//设置两点 line1.SetCo

  • Unity3D实现播放gif图功能

    Unity是不识别Gif格式图的,需要我们使用c#将gif里多帧图转化为Texture2D格式.需要使用System.Drawing.dll.此dll在unity安装目录下就可以找到.由于unity没有gif格式的文件,所以我们无法在面板指定,需要动态加载.所以将gif图放在StreamingAssets文件夹下.以下为源代码: using System; using System.Collections; using System.Collections.Generic; using Syst

  • Unity解析gif动态图操作

    工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本. 首先,Unity是不支持gif的(至少我没找到方法),而又要在NGUI中显示gif图片.所以就想到了将gif解析成序列帧再去循环播放. 有人说可以找软件解析,然后导入Unity做动画,最终我没有采用,自己再Unity中以代码解析,然后播放的. 代码如下 (在Awake中解析的,因为要在其他脚本调用,实时解析的话,到时候会花费一会时间): using System.Co

随机推荐