Unity之一天一个技术点(十四)

using UnityEngine;

using System.Collections;

/**

 * 备注:本脚本必须赋予主镜头

 */

public class CameraRotateAround : MonoBehaviour {

    public Transform target;//主相机要围绕其旋转的物体

    public float distance = 7.0f;//主相机与目标物体之间的距离

    private float eulerAngles_x;

    private float eulerAngles_y;

    //水平滚动相关

    public int distanceMax = 10;//主相机与目标物体之间的最大距离

    public int distanceMin = 3;//主相机与目标物体之间的最小距离

    public float xSpeed = 70.0f;//主相机水平方向旋转速度

    //垂直滚动相关

    public int yMaxLimit = 60;//最大y(单位是角度)

    public int yMinLimit = -10;//最小y(单位是角度)

    public float ySpeed = 70.0f;//主相机纵向旋转速度

    //滚轮相关

    public float MouseScrollWheelSensitivity = 1.0f;//鼠标滚轮灵敏度(备注:鼠标滚轮滚动后将调整相机与目标物体之间的间隔)

    public LayerMask CollisionLayerMask;

    // Use this for initialization

     void Start () {

        Vector3 eulerAngles = this.transform.eulerAngles;//当前物体的欧拉角

        this.eulerAngles_x = eulerAngles.y;

        this.eulerAngles_y = eulerAngles.x;      

     }

     // Update is called once per frame

    void LateUpdate()

    {

        if (this.target != null)

        {

            this.eulerAngles_x += ((Input.GetAxis("Mouse X") * this.xSpeed) * this.distance) * 0.02f;

            this.eulerAngles_y -= (Input.GetAxis("Mouse Y") * this.ySpeed) * 0.02f;

            this.eulerAngles_y = ClampAngle(this.eulerAngles_y, (float)this.yMinLimit, (float)this.yMaxLimit);

            Quaternion quaternion = Quaternion.Euler(this.eulerAngles_y, this.eulerAngles_x, (float)0);

            this.distance = Mathf.Clamp(this.distance - (Input.GetAxis("Mouse ScrollWheel") * MouseScrollWheelSensitivity), (float)this.distanceMin, (float)this.distanceMax);

            //从目标物体处,到当前脚本所依附的对象(主相机)发射一个射线,如果中间有物体阻隔,则更改this.distance(这样做的目的是为了不被挡住)

            RaycastHit hitInfo = new RaycastHit();

            if (Physics.Linecast(this.target.position, this.transform.position, out hitInfo, this.CollisionLayerMask))

            {

                this.distance = hitInfo.distance-0.05f;

            }

            Vector3 vector = ((Vector3)(quaternion * new Vector3((float)0, (float)0, -this.distance))) + this.target.position;

            //更改主相机的旋转角度和位置

            this.transform.rotation = quaternion;

            this.transform.position = vector;

        }

     }

    //把角度限制到给定范围内

    public float ClampAngle(float angle, float min, float max)

    {

        while (angle < -360)

        {

            angle += 360;

        }

        while (angle > 360)

        {

            angle -= 360;

        }

        return Mathf.Clamp(angle, min, max);

    }

}

通过鼠标控制镜头绕着某物体旋转

时间: 2025-01-01 18:45:41

Unity之一天一个技术点(十四)的相关文章

Unity之一天一个技术点(四)---遮挡剔除

遮挡剔除 http://game.ceeger.com/Manual/OcclusionCulling.html 可以有效减少drawCall 摄像机看不到的地方会自动消失.只渲染摄像机能看到的对象. 这篇讲解的已经很清楚了,而且经测试无误. 在我显示90多drawCall的时候,使用遮挡剔除可以有效减少至80左右,还是有一定效果的~ 欢迎大家跟我交流学习~共同进步~

【Unity 3D】学习笔记三十四:游戏元素——常用编辑器组件

常用编辑器组件 unity的特色之一就是编辑器可视化,很多常用的功能都可以在编辑器中完成.常用的编辑器可分为两种:原有组件和拓展组件.原有组件是编辑器原生的一些功能,拓展组件是编辑器智商通过脚本拓展的新功能. 摄像机 摄像机是unity最为核心组件之一,游戏界面中显示的一切内容都得需要摄像机来照射才能显示.摄像机组件的参数如下: clear flags:背景显示内容,默认的是skybox.前提是必须在render settings 中设置天空盒子材质. background:背景显示颜色,如果没

Unity之一天一个技术点(十九)--初学委托

委托这个对于C#初学者比较头疼,我也是看了半天资料才稍微弄懂一点,下面的代码还是挺简单的,也算用了委托这么逼格高的技术了. using UnityEngine; using System.Collections; //三个军衔级别的命令类型// public enum TypeOfCommands { General, Captain, Soldier } public class EventManager : MonoBehaviour { //定义一个通用代理,根据传递类型,发送消息 pub

Unity之一天一个技术点(十)---UI添加粒子特效

最近给UI添加粒子特效时,总是被UI遮挡, 解决方法是: 因为粒子系统的渲染顺序列默认为3000,而NGUI的渲染顺序默认也是从3000开始,当有嵌套的panel时或者Depth更高的panel时,GUI的渲染顺序会高于3000, 解决办法是, 1.修改Ngui中的UIPanel脚本中的默认的RenderQueue, 调整到3000以下,这样就不会遮挡住粒子特效了,当有的窗口需要显示在特效上面时,在检视面板中把该窗口的Renderer Q选项调整为Start At,值为3000以上,就可以解决,

Unity之一天一个技术点(十二)---指南针的实现

指南针的实现(可据镜头旋转改变) 代码如下: 变量简述: compassGUISkin皮肤用来显示指南针贴图 标签Label贴图用来作为指南针背景  Box贴图用来作为箭头贴图 把脚本赋予给主镜头即可 GUI.skin = compassGUISkin; var compassAngle : float = transform.rotation.eulerAngles.y;//得到镜头的y轴旋转角度 var compassDiameter : float = 128; var compassWi

Unity之一天一个技术点(十六)---狙击镜呼吸效果

我们正在做一个狙击游戏,然后要模仿一个狙击镜打开时候呼吸效果,也就是狙击镜会上下左右平缓位移,我参考网上的脚本又更改了一下,你可以直接挂在你的镜头上,然后屏幕中间放一个瞄准镜,就能看到很酷的效果~ public void Noise() { noisedeltaX += ((((Mathf.Cos(Time.time) * Random.Range(-nosieMaxRange, nosieMaxRange) / 5f) * nosieMaxSpeed) - noisedeltaX) / 100

Unity之一天一个技术点(十八)---让敌人缓慢转向,并且跟踪玩家

哦也,公司年会开完就放假,年前不会再更新了~ 提前恭祝大家新年快乐,心想事成~ public Transform target public int moveSpeed public int rotateSpeed private Transform mytransform; void awake (){ mytransform=this.transform; } void Start() { GameObject go=GameObject.FindGameObjectWithTag("Pla

Unity之一天一个技术点(十五)

给unity3d的老版动画中,添加事件的方法(测试通过): AnimationEvent event0 = new AnimationEvent(); event0.time =this.animation["run"].length * 0.2f; event0.functionName ="xxx"; event0.stringParameter="哈哈!"; animation["run"].clip.AddEvent(

Unity之一天一个技术点(十三)

var target : Transform; var distance = 10.0; var xSpeed = 250.0; var ySpeed = 120.0; var yMinLimit = -20; var yMaxLimit = 80; private var x = 0.0; private var y = 0.0; @AddComponentMenu("Camera-Control/Mouse Orbit") partial class MouseOrbit { }