OT源代码的分析,OrtHello 迟早攻破你 (五)默认的五种材质 和OTView

本文介绍了OT框架中默认的五种材质类型及其对应的shader,强调了修改script内texture的重要性以实现图片更换。同时,详细阐述了OTView组件的属性和功能,包括zoom、Position、Rotation等,以及如何通过World Bounds限制摄像机移动,并讨论了相关方法如Contains和mouseWorldPosition的应用。
摘要由CSDN通过智能技术生成

初学者都有这样的疑惑,为什么我托一个图片到材质中不行-,-  那是因为你不理解它的工作方式, 

首先最重要的一点就是与这5种材质相关的属相都不要轻易改变,要改图片的话该更换的地方时script里面的texture,在运行时就会自动改变了

OTMaterial-additive

shader为Moblie/ Particles / Additive


OTMaterial-solid 不透明的材质

shader为Unlit / Texture


OTMaterial-tinted   //可用来做一种染色的素材

shader为Moblie/ Particles / VertexLit Blended

带有一个Emissive Color为可渲染的颜色


OTMaterial-tintedAlpha  //同样可附上颜色,而且还是带透明的

OrtHello 特有的shader,shader为OrtHello / tintedAlpha 

有一个MainColor


OTMaterial-transparent  //最常用的,就是一个透明的通道

shader为Moblie/ Particles / Alpha Blended


//下面说OTView : MonoBehaviour


public float zoom  //变焦的值,设置0时为显示1比1的像素值,设置的值到达1时是看到的2倍的图像,设置的值为-1时看到的是一半的图像

经过我的检查,实际上变焦值变得时Projection摄像机的Size,但是这时摄像机的Size是被锁定的,实际上你只能通过view来改变

Position在摄像机被锁死后实际上没有作用

Rotation可旋转,还是有作用的

Movement Target 是跟随移动的物体,这样设置的话会让主角一直在屏幕中央

Rotation Target 是跟随旋转的物体,这样设置的话会让主角一直在屏幕保持不动

World Bounds  世界边界,会限制摄像机的移动范围。

Always Pix Perfect 总是实际像素,可不勾

Pixel Perfect Resolution  实际分辨尺寸

Custom Size  自定义尺寸-,-最好不要设置这个  各种问题

Draw Gizmos //是否在3d场景中画出边界

Gizmos Color //遮挡颜色


下面是它的方法:

public bool Contains(OTObject o)  检查某个物体是否在视野中

public Vector2 mouseWorldPosition //实际上它是camera.ScreenToWorldPoint(Input.mousePosition);的封装

其它实用一点的方法就一个都没找到了

继续贴update

public void Update()
    {
		if (!OT.isValid) return;
        
        if (Application.isEditor)
        {
            // aspect ration check - because it sometimes is forced back to 4:3 ???
            float asp = (float)Screen.width / (float)Screen.height;
            if (asp!=camera.aspect) return;
            GetWorldRect();

            if (_position_ == _position)
            {
                if (!Vector2.Equals((Vector2)camera.transform.position, _position))
                {
                    _position = camera.transform.position;
                    _position_ = _position;
                    transform.position = camera.transform.position;
                }
            }
        }
    
        if (customSize != _customSize)
        {
            _customSize = customSize;
            sizeFact = ((customSize / 300) / pixelPerfectResolution.y) * 600;
        }

        if (_zoom != zoom)
            GetWorldRect();

        if (customSize == 0)
            sizeFact = 1;
		
        // check camera type
        if (!camera.orthographic)
            SetCamera();

        // check camera size
        if (camera.orthographicSize != resSize * (Mathf.Pow(2, _zoom * -1)))
            camera.orthographicSize = resSize * Mathf.Pow(2, _zoom * -1);

        if (Application.isEditor && (transform.position.x != _position.x || transform.position.y != _position.y) && _position == _position_)
        {
            camera.transform.position = new Vector3(transform.position.x, transform.position.y, -1001);
            _position = new Vector2(camera.transform.position.x, camera.transform.position.y);
            _position_ = position;
        }

        Vector2 pos = OT.view.position;
        if (OT.view.movementTarget != null)
            pos = OT.view.movementTarget.transform.position;

        if (worldBounds.width != 0)
        {
            bool clampX = (Mathf.Abs(worldBounds.width)>=Mathf.Abs(worldRect.width));
            if (clampX)
            {
                float minX = _worldBounds.xMin;
                float maxX = _worldBounds.xMax;
                if (maxX < minX)
                {
                    float tmp = minX;
                    minX = maxX;
                    maxX = tmp; 
                }
                minX += Mathf.Abs(worldRect.width / 2);
                maxX -= Mathf.Abs(worldRect.width / 2);
                pos.x = Mathf.Clamp(pos.x, minX, maxX);
            }
            else
                pos.x = (worldRect.xMin + worldRect.width / 2);


            bool clampY = (Mathf.Abs(worldBounds.height) >= Mathf.Abs(worldRect.height));
            if (clampY)
            {
                float minY = _worldBounds.yMin;
                float maxY = _worldBounds.yMax;

                if (maxY < minY)
                {
                    float tmp = minY;
                    minY = maxY;
                    maxY = tmp;
                }

                minY += Mathf.Abs(worldRect.height / 2);
                maxY -= Mathf.Abs(worldRect.height / 2);
                pos.y = Mathf.Clamp(pos.y, minY, maxY);
            }
            else
                pos.y = (worldRect.yMin + worldRect.height / 2);

            position = pos;
        }
        else
            position = pos;

        // check camera position
        if (_position_ != _position)
        {
            _position_ = _position;
            if (camera.transform.position.x != _position.x || Camera.main.transform.position.y != _position.y || Camera.main.transform.position.z != -1001)
            {
                camera.transform.position = new Vector3(_position.x, _position.y, -1001);
                transform.position = camera.transform.position;
                GetWorldRect();
            }
        }

        if (OT.view.rotationTarget != null)
           OT.view.rotation = OT.view.rotationTarget.transform.eulerAngles.z;

        // check camera position
        if (camera.transform.eulerAngles.z != _rotation)
        {
            camera.transform.eulerAngles = new Vector3(0, 0, _rotation);
            transform.rotation = camera.transform.rotation;
        }

    }






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值